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

Json.Net在列表反序列化时调用属性getter,导致重复item共享

时间:2023-04-10 17:39:25 C#

Json.Net在列表反序列化时调用属性getter,导致重复item程序的memento模式。我正在使用备忘录在失败的数据库事务上回滚对象。我遇到的问题是,在反序列化备忘录时,会调用getter而不是setter。让我证明一下:classMyClass{publicintID{get;放;}publicstringfield1{get;放;}publicstringfield2{get;放;}私有列表_someObjects;公共列表SomeObjects{get{if(_someObjects==null){_someObjects=LoadSomeObjectsFromDB();}返回_someObjects;}设置{_someObjects=值;}}私有列表_anotherObjects;公共列表AnotherObjects{get{if(_anotherObjects==null){_anotherObjects=LoadAnotherObjectsFromDB();}返回对象_ano;}设置{_anotherObjects=值;}}}*MyObject,SomeObject和SomeObject扩展相同的基类Model从上面的示例类可以看到,如果SomeObjects还没有加载,它将使用延迟加载从数据库加载它。现在当我序列化这个对象时。stringmemento=JsonConvert.SerializeObject(obj);结果为{"ID":1,"field1":"field1","field2":"field2","SomeObjects":[{"ID":1,},{"ID":2,},{"ID":3,}],"AnotherObjects":[{"ID":4,},{"ID":5,},{"ID":6,}]}并反序列化。MyObjectobj=JsonConvert.DeserializeObject(memento,typeof(MyObject));我得到一个由以下JSON表示的对象{"ID":1,"field1":"field1","field2":"field2","SomeObjects":[{"ID":1,},{"ID":2,},{"ID":3,},{"ID":1,},{"ID":2,},{"ID":3,}],"AnotherObjects":[{"ID":4,},{"ID":5,},{"ID":6,},{"ID":4,},{"ID":5,},{"ID":6,}]}SomeObjects和SomeObjectsList对于SomeObjects的getter有太多的项目,这导致List从DB初始化,然后序列化列表将附加到它。给我留下的清单比预期的要多。但是,如果我删除延迟加载部分publicListSomeObjects{get{/*if(_someObjects==null){_someObjects=LoadSomeObjectsFromDB();}*/返回_someObjects;}设置{_someObjects=值;}}仍然调用getter,但返回null。然后json.net调用setter,其值是一个列表,其中已经添加了正确数量的元素,而如果getter返回一个初始化列表,它会附加到它而不调用setter。为什么不同,如果列表已经初始化,则调用getter并将其附加到。但如果未初始化,则调用setter并使用已填充对象的列表进行初始化。有没有办法让json.net在反序列化通用列表期间只调用setter?为此,Json.Net有一个ObjectCreationHandling设置。尝试将其设置为替换,例如:JsonSerializerSettingssettings=newJsonSerializerSettings();settings.ObjectCreationHandling=ObjectCreationHandling.Replace;MyObjectobj=JsonConvert.DeserializeObject(memento,settings);Demo:https://dotnetfiddle.net/rkY1pt以上为C#学习教程:Json.Net在列表反序列化时调用属性getter,导致重复项共享所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: