采用序列NewtonSoft

采用序列NewtonSoft

本文介绍了采用序列NewtonSoft.JSON接口/抽象对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

反序列化接口和抽象属性的一种方式是一类被序列化和反序列化过程中设置TypeNameHandling为自动。然而,当我序列化和直接反序列化的接口对象时尝试同样的,这是行不通的 -

 接口ISample 
{
字符串键{获得;组; }
}

类答:ISample
{
公共字符串键{获得;组; }

公开发行A(字符串键)
{
this.Key =键;
}
}

B类:ISample
{
公共字符串键{获得;组; }

公众B(字符串键)
{
this.Key =键;
}
}



序列化和反序列化的代码 -

  ISample一个新= A(科亚); 
ISample B =新B(KEYB);

VAR设置=新JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Auto;

VAR stringA = JsonConvert.SerializeObject(一,设置);
VAR stringB = JsonConvert.SerializeObject(B,设置);

Console.WriteLine(stringA);
Console.WriteLine(stringB);

A = JsonConvert.DeserializeObject< ISample>(stringA,设置);
B = JsonConvert.DeserializeObject< ISample>(stringB,设置);



我注意到,设置TypeNameHandling.Auto类型的信息,即使不存在序列化的字符串。然而,设置TypeNameHandling到对象或全部的作品。



我失去了一些基本的东西在这里?


解决方案

要允许输出 $类型信息的在根级别的一个多态对象与 TypeNameHandling.Auto ,使用以下过载:。从:



In your case, you would do:

        var stringA = JsonConvert.SerializeObject(a, typeof(ISample), settings);
        var stringB = JsonConvert.SerializeObject(b, typeof(ISample), settings);

        Console.WriteLine(stringA);
        Console.WriteLine(stringB);

And get the result:

{"$type":"Tile.TestJsonDotNet.A, Tile","Key":"keyA"}
{"$type":"Tile.TestJsonDotNet.B, Tile","Key":"keyB"}

这篇关于采用序列NewtonSoft.JSON接口/抽象对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 10:37