自定义序列化设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义序列化设置相关的知识,希望对你有一定的参考价值。

我正在创建一个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
};

我在文档中找不到任何地方,或者在亚马逊实现中如何做到这一点。有人定制过LambdaSerializer吗?

答案

这是一个简单的例子:

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

}

在你的lambda函数中,你将拥有:

[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,但为了安全起见,您应该将其默认转换器添加到序列化程序中。我现在不打扰,但是没关系。

希望这可以帮助。

亚当。

以上是关于自定义序列化设置的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段——声明函数

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段8——声明函数

VSCode自定义代码片段——CSS动画