使用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
传递给序列化程序,因此TypeNameHandling.Auto
会包含$type
当Child
被设置为MyChild
的实例时。
非常感谢任何见解。
更新 在CodePlex TypeNameHandling.Auto and ISerializable
上打开工作项答案 0 :(得分:1)
正如我在上面的更新中所提到的,这是JSON.NET(Json.NET 5.0 Release 5)中当前实现的问题,并且有望在将来的版本中得到解决。
与此同时,我为每个需要扩展序列化的类型设置了一个自定义JsonConverter类,以允许我的类保持DataContract
和JsonProperty
属性。
CodePlex问题:https://json.codeplex.com/workitem/24354