Вот простой пример:
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 по умолчанию, но для безопасности вам, вероятно, следует добавить конвертеры по умолчанию в ваш сериализатор. Сейчас я не беспокоюсь, и все было в порядке.
Надеюсь, это поможет.
Адам.