使用“ISerializable.GetObjectData '没有设置' $type ',尽管' TypeNa



使用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传递给序列化器,那么当给定Child被设置为MyChild的实例时,TypeNameHandling.Auto将包含$type

如有任何见解,不胜感激。


更新在CodePlex TypeNameHandling上打开的工作项。自动和可序列化

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

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

CodePlex Issue: https://json.codeplex.com/workitem/24354

相关内容

  • 没有找到相关文章

最新更新