2

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 から継承しています (継承を削除するか、メンバーに別の型を与えると機能します)。

データをシリアル化する前は「正しい」データであり、逆シリアル化した後のデータは「間違っている」-> メンバーは null です。

それを手伝ってもらえますか?

4

1 に答える 1