在JSON数据中生成 $type
值的主要目的(或优势)是什么?它是否以某种方式简化了反序列化?
我通过设置(de)序列化程序的TypeNameHandling
属性来启用此功能,因为我的目的是进行强大的验证,尤其是在反序列化期间。但是现在我发现,即使没有生成 $type
信息,反序列化也没有问题反序列化数据。
那么,请问 $type
与Newtonsoft JSON一起使用的用例是什么?
答案 0 :(得分:0)
该设置允许您序列化在其类型定义中具有接口或(抽象)基类的类。
考虑以下类型:
public class MySerializableClass
{
public IOther Other {get;set;}
public BaseClass Base {get;set;}
}
public interface IOther
{
public string Foo {get;set;}
}
public abstract class BaseClass
{
public int MyNumber {get;set;}
}
如果您这样做:
JsonConvert.DeserializeObject<MySerializableClass>(json);
json.net不知道如何创建IOther和Baseclass的实例,因为它们是抽象的。因此,它为您提供此设置以支持此类基类或接口的序列化,因为它将该属性的实例类型存储在生成的json的$ type成员中。
通常,bun会建议你不要这样做,因为存储到db或其他东西的json中的类型名称可能会发生变化(名称空间更改等),并且在代码更改时反序列化会有问题。