1

使用 JSON.NET v5.0.5,我选择使用ISerializableoverDataMemberJsonProperty属性。我更喜欢使用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并传递给序列化程序 as Object,那TypeNameHandling.Auto将包括$typewhen givenChild被设置为MyChild.

任何见解将不胜感激。


更新CodePlex TypeNameHandling.Auto 和 ISerializable 上打开的工作项

4

1 回答 1

1

正如我在上面的更新中提到的,这是 JSON.NET(Json.NET 5.0 第 5 版)中当前实现的一个问题,希望在未来的版本中得到解决。

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

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

于 2013-06-05T03:10:42.307 回答