使用JSON.net,当在基类上下文中使用时,如何防止派生类的属性序列化?给定一个数据模型:[DataContract]publicclassParent{[DataMember]publicIEnumerableChildren{get;放;}}[DataContract]publicclassChildId{[DataMember]publicstringId{get;放;}}[DataContract]publicclassChildDetail:ChildId{[DataMember]publicstringName{get;放;}}为了实现方便,有时Parent上的ChildDetail对象实际上是一个ChildDetail对象。当我使用JSON.net序列化Parent时,它们将与所有ChildDetail属性一起写出。有什么方法可以指示JSON.net(或任何其他JSON序列化程序,我还不能提交给项目)在序列化到基类时忽略派生类属性?编辑:重要的是,当我直接序列化派生类时,我能够生成所有属性。我只想抑制Parent对象中的多态性。我使用自定义合同解析器来限制我的哪些属性被序列化。这可能会为您指明正确的方向。例如//////json.net默认情况下序列化一个类的所有属性///这个类将告诉json.net只序列化属性,如果它们匹配///通过查询字符串传递给标准的有效列列表对象///publicclassCriteriaContractResolver:DefaultContractResolver{List_properties;publicCriteriaContractResolver(Listproperties){_properties=properties}protectedoverrideIListCreateProperties(JsonObjectContractcontract){IListfiltered=newList();}))if(_properties.Contains(p.PropertyName))filtered.Add(p);返回过滤;在重写的IList函数中,您可以使用反射来填充列表,可能只包含父属性。合同解析器与您的json.net序列化器一起工作。此示例来自asp.netmvc应用程序。JsonNetResult结果=newJsonNetResult();结果.Formatting=Formatting.Indented;result.SerializerSettings.ContractResolver=newCriteriaContractResolver(Criteria);我遇到了完全相同的问题,正在查找如何构建我实际上正在寻找的ContractResolver,最好回答这个问题。这只会序列化您想要序列化的类型T的属性,但是通过这个示例,您也可以轻松构建类似的方法:publicclassTypeOnlyContractResolver:DefaultContractResolver{创建属性(成员,成员序列化);property.ShouldSerialize=instance=>property.DeclaringType==typeof(T);归还财产;看看这个类似线程中的答案,特别是我的答案中的IgnorableSerializerContractResolver和更好的lambda版本用法:varjsonResolver=newIgnorableSerializerContractResolver();//忽略单个属性jsonResolver.Ignore(typeof(Company),"WebSites");//忽略单一数据类型jsonResolver.Ignore(typeof(System.Data.Objects.DataClasses.EntityObject));varjsonSettings=newJsonSerializerSettings(){ReferenceLoopHandling=ReferenceLoopHandling.Ignore,ContractResolver=jsonResolver};我没有专门使用JSON.Net,所以不是很肯定,这会对您有所帮助。如果JSON.Net派生自.Net序列化系统,那么您应该能够将[NonSerialized]属性添加到您现在希望在基类中序列化的属性。在基类上调用序列化方法时,序列化应该跳过这些元素。有一个类似的问题,这是我想出的ContractResolver:publicclassStrictTypeContractResolver:DefaultContractResolver{privatereadonlyType_targetType;publicStrictTypeContractResolver(TypetargetType)=>_targetType=targetType;受保护的重写IListCreateProperties(Typetype,MemberSerizationmemberization=>).CreateProperties(_targetType.IsAssignableFrom(type)?_targetType:type,memberSerialization);它只会截断targetType的后代的属性,而不是它的基类或targetType属性可能引用的其他类型的属性。根据您的需要,这可能会或可能不会比当时提供的其他答案有所改进。没有比较性能受到影响,但这是一个有效的解决方案,也适用于嵌套/引用的对象。以上就是C#学习教程:使用JSON.net,在基类上下文中使用时如何防止派生类属性序列化?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——Derivedd=newDerived();字符串jsonStringD=JsonConvert.SerializeObject(d);基数b=新基数();JsonConvert.PopulateObject(jsonStringD,b);字符串jsonStringB=JsonConvert.SerializeObject(b);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
