【问题标题】:ServiceStack JsonSerializer not serializing object members when inheritance继承时ServiceStack JsonSerializer不序列化对象成员
【发布时间】:2013-06-25 22:09:14
【问题描述】:

我正在尝试使用 ServiceStack.Redis,但我注意到,当我存储一个对象时,它的成员是从另一个对象继承的对象,并在稍后尝试获取它时,我得到了 null。

我检查并发现 ServiceStack.Redis 正在使用 ServiceStack.JsonSerializer 所以我尝试创建一个测试用例:

class Program
{
    public class ClassA
    {
        public string Id;

        public Dictionary<string, ClassB> dic = new Dictionary<string, ClassB>();
    }

    public class ClassB
    {
        public string Id;   
    }

    public class ClassC : ClassB
    {
        public object C;
    }

    public class ClassD
    {
        public string Id;
    }

    static void Main(string[] args)
    {
        ClassA t = new ClassA();
        t.Id = Guid.NewGuid().ToString("n");
        t.dic.Add("AAA", new ClassC());
        t.dic["AAA"].Id = Guid.NewGuid().ToString("n");
        ((ClassC)t.dic["AAA"]).C = new ClassD();
        ((ClassD)((ClassC)t.dic["AAA"]).C).Id = Guid.NewGuid().ToString("n");

        ServiceStack.Text.JsConfig.IncludeNullValues = true;
        ServiceStack.Text.JsConfig.IncludePublicFields = true;
        ServiceStack.Text.JsConfig.IncludeTypeInfo = true;
        ServiceStack.Text.JsConfig.MaxDepth = int.MaxValue;

        Console.WriteLine("before SerializeToString data is:");
        if (string.IsNullOrEmpty(((ClassD)((ClassC)t.dic["AAA"]).C).Id))
        {
            Console.WriteLine("wrong");
        }
        else
        {
            Console.WriteLine("right");
        }

        string a = JsonSerializer.SerializeToString<ClassA>(t);

        ClassA t2 = JsonSerializer.DeserializeFromString<ClassA>(a);

        Console.WriteLine("after SerializeToString data is:");
        if (((ClassC)t2.dic["AAA"]).C == null ||
            string.IsNullOrEmpty(((ClassD)((ClassC)t2.dic["AAA"]).C).Id))
        {
            Console.WriteLine("wrong");
        }
        else
        {
            Console.WriteLine("right");
        }

        Console.ReadLine();
    }
}

当它不起作用时,我可以找到一个更简单的案例......

如您所见,ClassC 有一个类型为 object 的成员,并且该类从 ClassB 继承(如果您删除继承或为成员提供另一种类型,它将起作用)。

序列化前数据“正确”,反序列化后数据“错误” -> 成员为空。

你能帮帮我吗?

【问题讨论】:

    标签: c# json serialization servicestack jsonserializer


    【解决方案1】:

    默认情况下,ServiceStack 只序列化公共属性。要序列化公共字段,您还需要设置:

    JsConfig.IncludePublicFields = true;
    

    另外,如果你想使用继承,你需要使子类抽象或接口。 See this answer for more info.

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2013-08-31
      • 2016-10-21
      • 1970-01-01
      • 2012-11-03
      • 2011-10-31
      • 2012-09-07
      • 2013-09-06
      • 2014-06-22
      相关资源
      最近更新 更多