ServiceStack JsonSerializer在继承时不会序列化对象成员

时间:2013-06-28 07:34:56

标签: c# json serialization servicestack jsonserializer

我正在尝试使用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继承(如果删除继承或给成员另一个类型,它将起作用)。

在序列化之前,数据是“正确的”,并且在反序列化之后数据是“错误的” - &gt;该成员为空。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:5)

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

JsConfig.IncludePublicFields = true;

此外,如果要使用继承,则需要使子类为抽象或接口。 See this answer for more info