尽管`TypeNameHandling.Auto`,使用`ISerializable.GetObjectData`不设置`$ type`

时间:2013-06-01 16:35:53

标签: c# serialization json.net

使用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会包含$typeChild被设置为MyChild的实例时。

非常感谢任何见解。


更新 在CodePlex TypeNameHandling.Auto and ISerializable

上打开工作项

1 个答案:

答案 0 :(得分:1)

正如我在上面的更新中所提到的,这是JSON.NET(Json.NET 5.0 Release 5)中当前实现的问题,并且有望在将来的版本中得到解决。

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

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