Пользовательские настройки сериализатора - PullRequest
0 голосов
/ 16 января 2019

Я создаю функцию AWS Lambda, которая будет принимать полезную нагрузку JSON и обрабатывать ее. Вместе с C # SDK они предоставляют сериализатор, основанный на Newtonsoft.Json.

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

Мне нужно указать пользовательские форматы для дат, чтобы, среди прочего, все можно было правильно десериализовать в класс .NET.

В Newtonsoft.Json я могу определить пользовательские настройки следующим образом:

new JsonSerializerSettings()
{
    DateFormatString = "yyyyMMdd",
    Formatting = Formatting.Indented,
    NullValueHandling = NullValueHandling.Ignore
};

Я не могу найти нигде в документации или каким-либо другим образом, как это можно сделать с помощью реализации Amazon. Кто-нибудь настраивал LambdaSerializer?

1 Ответ

0 голосов
/ 16 января 2019

Вот простой пример:

using System;
using System.Collections.Generic;
using System.IO;

using Amazon.Lambda.Core;

namespace MySerializer
{
    public class LambdaSerializer : ILambdaSerializer
    {

        public LambdaSerializer()
        {
        }


        public LambdaSerializer(IEnumerable<Newtonsoft.Json.JsonConverter> converters) : this()
        {
            throw new NotSupportedException("Custom serializer with converters not supported.");
        }


        string GetString(Stream s)
        {
            byte[] ba = new byte[s.Length];

            for (int iPos = 0; iPos < ba.Length; )
            {
                iPos += s.Read(ba, iPos, ba.Length - iPos);
            }

            string result = System.Text.ASCIIEncoding.ASCII.GetString(ba);
            return result;
        }


        public T Deserialize<T>(Stream requestStream)
        {
            string json = GetString(requestStream);
            // Note: you could just pass the stream into the deserializer if it will accept it and dispense with GetString()
            T obj = // Your deserialization here
            return obj;
        }


        public void Serialize<T>(T response, Stream responseStream)
        {
            string json = "Your JSON here";
            StreamWriter writer = new StreamWriter(responseStream);
            writer.Write(json);
            writer.Flush();
        }

    } // public class LambdaSerializer

}

В вашей лямбда-функции у вас будет это:

[assembly: LambdaSerializer(typeof(MySerializer.LambdaSerializer))]

namespace MyNamespace
{

   public MyReturnObject FunctionHandler(MyInObject p, ILambdaContext context)
   {

   }

Обратите внимание, что явное выполнение интерфейса не работает:

void ILambdaContext.Serialize<T>(T response, Stream responseStream)
{
   // won't work

Не спрашивайте меня, почему. Я предполагаю, что AWS создает объект и не приводит его к интерфейсу, а ожидает открытых методов.

На самом деле вы можете найти исходный код сериализатора, но в данный момент я не могу его найти. Если мне попадется, я отредактирую этот пост.

По моему опыту, используется только ctor по умолчанию, но для безопасности вам, вероятно, следует добавить конвертеры по умолчанию в ваш сериализатор. Сейчас я не беспокоюсь, и все было в порядке.

Надеюсь, это поможет.

Адам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...