使用 JSON.NET v5.0.5,我选择使用ISerializable
overDataMember
或JsonProperty
属性。我更喜欢使用ISerializable
它,因为它允许我完全控制序列化而不依赖于我的类上的 JsonProperty 等。
我已经声明了以下 JsonSerializer ...
new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Auto,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
MissingMemberHandling = MissingMemberHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Ignore,
NullValueHandling = NullValueHandling.Ignore
};
当被序列化的对象与声明类型不同时,TypeNameHandling.Auto
应包含在哪里。$type
使用时,DataContract
我确实得到了预期的 JSON:
[DataContract]
public class MyParent
{
[DataMember(Name = "c")]
public SomeBase Child { get; private set; }
}
[DataContract]
public class MyChild : SomeBase
{
[DataMember(Name = "p")]
public String MyProperty { get; private set; }
}
导致预期的 JSON:
{"c":{"$type":"...+MyChild,...","p":"My Test String"}}
但是,如果我修改MyParent
为以下内容:
[Serializable]
public class MyParent : ISerializable
{
public SomeBase Child { get; private set; }
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("c", Child);
}
}
生成的 JSON 是:
{"c":{"p":"My Test String"}}
我会认为既然Child
被声明为SomeBase
并传递给序列化程序 as Object
,那TypeNameHandling.Auto
将包括$type
when givenChild
被设置为MyChild
.
任何见解将不胜感激。
更新CodePlex TypeNameHandling.Auto 和 ISerializable 上打开的工作项