2013-06-01 61 views
1

使用JSON.NET v5.0.5,我选择使用ISerializable而不是DataMemberJsonProperty属性。我更喜欢使用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

+0

会发生什么事,如果你设置'TypeNameHandling'到'All'? –

+0

@Brian,如果我打开'All',然后写'$ type',但是我希望避免额外的数据时,可以推断类型。 –

+0

那么,至少你有一个解决方法。 –

回答

1

正如我上面提到的更新开业工作项目,这与内JSON.NET目前执行的问题(Json.NET 5.0发行5)和意志希望在未来的版本中得到解决。

同时,我为每种需要扩展序列化的类型设置了一个自定义的JsonConverter类,以允许我的类保持不受DataContractJsonProperty属性的影响。

的CodePlex问题:https://json.codeplex.com/workitem/24354

相关问题