使用JSON。NET v5.0.5,我选择使用ISerializable
而不是DataMember
或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
并作为Object
传递给序列化器,那么当给定Child
被设置为MyChild
的实例时,TypeNameHandling.Auto
将包含$type
。
如有任何见解,不胜感激。
更新在CodePlex TypeNameHandling上打开的工作项。自动和可序列化
正如我在上面的更新中提到的,这是JSON当前实现的一个问题。净(Json。. NET 5.0 Release 5),并有望在未来的版本中解决。
同时,我为每个需要扩展序列化的类型设置了一个自定义JsonConverter类,以允许我的类保持不受DataContract
和JsonProperty
属性的影响。
CodePlex Issue: https://json.codeplex.com/workitem/24354