当前位置: 首页 > 编程语言 > C#

JSON.NET序列化——DefaultReferenceResolver如何比较相等性?

时间:2023-04-10 14:29:35 C#

JSON.NET序列化-DefaultReferenceResolver如何比较相等性?我正在使用JSON.NET6.0.3。我将PreserveReferences选项更改为如下所示:HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling=PreserveReferencesHandling.Objects;我的对象图如下所示:publicclassCarFromManufacturer{publicintCarID{get;放;}publicstringMake{}publicstringModel{get;放;}publicCarManufacturer制造商{get;放;}}publicclassCarManufacturer{publicintManufacturerID{get;放;}公共字符串名称{得到;放;我的WebAPI控制器返回一个IEnumerable[CarFromManufacturer]的结果集。因此,结果可能是来自两个唯一制造商对象的5辆汽车的列表。我希望JSON结果在完全序列化时只列出每个制造商一次,然后使用与原始$id相同的制造商作为$refID。那没有发生。尽管我找不到关于如何为ReferenceResolver建立相等性的单个文档,但我已经实现了IEquatable并覆盖了base.Equals和base.GetHashCode()但没有成功。我想避免实现自己的IReferenceResolver,因为在同一个项目中具有非常相似的对象图可以按预期工作。我唯一能想到的是,我正在使用一个工厂对象,而不是首先创建每个唯一的CarManufacturer,然后创建一个传递CarFromManufacturer的CarFufacturer实例……我正在创建一个新的CarManufacturer实例。这可以解释为什么对象不相等,但这就是我实现IEquatable并覆盖base.Equals(object)和base.GetHashCode()的原因。我查看了DefaultReferenceResolver的源代码,它使用BidirectionalDictionary的默认构造函数,它使用EqualityComparer.Default,来自MSDN文档,如果它存在,它使用T的IEquatable实现,否则它使用T的base.Equals()实现。..所有这些让我相信CarManufacturer中的IEquatable应该可以解决我的问题。但是,在CarManufacturer.Equals()和GethashCode()中放置断点永远不会命中。默认情况下,JSON.NET用于解析引用的逻辑仅使用此比较器比较引用。如果要以不同方式比较对象,则必须实现自定义IReferenceResolver。这是一个使IEqualityComparer适用于您的示例的示例:publicclassReferenceResolver:IReferenceResolver{privateDictionarystringToReference;私有字典引用到字符串;私有int引用计数;publicReferenceResolver(IEqualityComparer比较器){this.stringToReference=newDictionary();this.referenceToString=newDictionary(比较器);this.referenceCount=0;}publicvoidAddReference(objectcontext,stringreference,objectvalue){this.referenceToString.Add((T)value,reference);this.stringToReference.Add(引用,(T)值);}publicstringGetReference(objectcontext,objectvalue){stringresult=null;if(!this.referenceToString.TryGetValue((T)value,outresult)){referenceCount++;结果=referenceCount.ToString(CultureInfo.InvariantCulture);this.referenceToString.Add((T)value,result);this.stringToReference.Add(结果,(T)值);}返回结果;}publicboolIsReferenced(对象上下文,对象值){返回this.referenceToString.ContainsKey((T)value);}publicobjectResolveReference(objectcontext,stringreference){Tr=default(T);this.stringToReference.TryGetValue(reference,outr);返回r;Json.Net将在被比较的对象上调用Equals方法在某些情况下您可能不希望这样做,例如当它检查循环引用时它会做同样的事情并且检查引用相等性可能更可取。但是,他们这样做是为了让开发人员通过覆盖类中的Equals方法来完全控制。您可以覆盖默认实现。例如,要使其引用相等,你会这样做:以上是C#学习教程:JSON.NET序列化——DefaultReferenceResolver如何比较相等?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——varsettings=newJsonSerializerSettings{EqualityComparer=newDefaultEqualityComparer(),};公共类DefaultEqualityComparer:IEqualityComparer{publicboolEquals(objectx,objecty){returnReferenceEquals(x,y);}publicintGetHashCode(objectobj){returnobj.GetHashCode();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: