栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

反序列化IEnumerable 应用[DataContract]的方法不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反序列化IEnumerable 应用[DataContract]的方法不起作用

更新2

为了向后兼容,在11.0.2中将其还原。请参阅原始答案以获取解决方案。

更新资料

报告为
问题#1598:DataContractAttribute不会导致IEnumerable的JSon对象序列化,
并已在commit中修复

e9e2d00
。它应该在10.0.3之后的下一发行版中,它可能是Json.NET版本11。

原始答案

我注意到您

Activities
[DataContract]
和标记了您的班级
[DataMember]

[DataContract]public class Activities : IEnumerable<Activity>{    private List<Activity> _list;    [DataMember]    public List<Activity> List    {        get { return this._list; }        set { this._list = value; }    }    // ...}

应用

[DataContact]
将导致
DataContractJsonSerializer
将一个序列化为
IEnumerable<T>
带有属性的JSON对象,而不是JSON数组。由于Json.NET
在应用于非枚举时支持数据协定属性,因此您可能会认为它也会在枚举和集合中尊重它们。

但是,看来这没有实现。如果我使用序列化您的课程

DataContractJsonSerializer
,我会看到

{"List":[{"Id":1,"Name":"test1"},{"Id":2,"Name":"test2"}]}

但是,如果我使用Json.NET进行序列化,则会发现

[DataContract]
忽略了:

[{"Id":1,"Name":"test1"},{"Id":2,"Name":"test2"}]

然后,稍后它将在反序列化期间引发异常,因为它不知道如何向

IEnumerable<Activity>
类中添加成员。(如果您的类已实现
ICollection<Activity>
,或者具有带
IEnumerable<Activity>
参数的构造函数,则可以添加成员。)

那么,这应该工作吗?文档页面“
序列化属性”指出:

DataContractAttribute可以替代JsonObjectAttribute。DataContractAttribute将默认成员序列化以选择加入。

这意味着Json.NET应该按照您期望的方式工作。如果需要,可以报告有关此问题的信息-
至少应弄清楚文档。

解决方法是
,如果要强制Json.NET将集合序列化为对象,则需要使用

[JsonObject]

[DataContract][JsonObject(MemberSerialization = MemberSerialization.OptIn)]public class Activities : IEnumerable<Activity>{    private List<Activity> _list;    [DataMember]    [JsonProperty]    public List<Activity> List    {        get { return this._list; }        set { this._list = value; }    }    // Remainder unchanged.}

如果您

[DataContract]
应用了许多可枚举的类,或者无法在模型中添加对Json.NET的依赖关系,则可以创建一个自定义项
ContractResolver
,以检查
[DataContract]
on枚举类的存在并将它们序列化为对象:

public class DataContractForCollectionsResolver : DefaultContractResolver{    // As of 7.0.1, Json.NET suggests using a static instance for "stateless" contract resolvers, for performance reasons.    // http://www.newtonsoft.com/json/help/html/ContractResolver.htm    // http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Serialization_DefaultContractResolver__ctor_1.htm    // "Use the parameterless constructor and cache instances of the contract resolver within your application for optimal performance."    static DataContractForCollectionsResolver instance;    static DataContractForCollectionsResolver() { instance = new DataContractForCollectionsResolver(); }    public static DataContractForCollectionsResolver Instance { get { return instance; } }    protected DataContractForCollectionsResolver() : base() { }    protected override JsonContract CreateContract(Type objectType)    {        var t = (Nullable.GetUnderlyingType(objectType) ?? objectType);        if (!t.IsPrimitive  && t != typeof(string) && !t.IsArray && typeof(IEnumerable).IsAssignableFrom(t)  && !t.GetCustomAttributes(typeof(JsonContainerAttribute),true).Any())         {  if (t.GetCustomAttributes(typeof(DataContractAttribute),true).Any())      return base.CreateObjectContract(objectType);        }        return base.CreateContract(objectType);    }}

然后使用以下设置:

var serializerSettings = new JsonSerializerSettings(){    DateFormatHandling = DateFormatHandling.IsoDateFormat,    DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset,    ContractResolver = DataContractForCollectionsResolver.Instance};


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号