使用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
的实例时。
任何有识之士将不胜感激。
UPDATE CodePlex上TypeNameHandling.Auto and ISerializable
会发生什么事,如果你设置'TypeNameHandling'到'All'? –
@Brian,如果我打开'All',然后写'$ type',但是我希望避免额外的数据时,可以推断类型。 –
那么,至少你有一个解决方法。 –