使用 JSON.NET v5.0.5,我选择使用ISerializableoverDataMember或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将包括$typewhen givenChild被设置为MyChild.
任何见解将不胜感激。
更新CodePlex TypeNameHandling.Auto 和 ISerializable 上打开的工作项