C# 在列表的反序列化过程中,Json.Net调用属性getter,导致重复项

C# 在列表的反序列化过程中,Json.Net调用属性getter,导致重复项,c#,winforms,json.net,json-deserialization,C#,Winforms,Json.net,Json Deserialization,我正在使用json.net实现winform应用程序的。我正在使用memento回滚失败数据库事务上的对象。我遇到的问题是,当反序列化纪念品时,调用getter而不是setter。让我示范一下: class MyClass { public int ID { get; set; } public string field1 { get; set; } public string field2 { get; set; } private List<SomeO

我正在使用json.net实现winform应用程序的。我正在使用memento回滚失败数据库事务上的对象。我遇到的问题是,当反序列化纪念品时,调用getter而不是setter。让我示范一下:

class MyClass
{
    public int ID { get; set; }
    public string field1 { get; set; }
    public string field2 { get; set; }

    private List<SomeObject> _someObjects;
    public List<SomeObject> SomeObjects
    {
        get
        {
            if(_someObjects == null)
            {
                _someObjects = LoadSomeObjectsFromDB();
            }
            return _someObjects;
        }
        set
        {
            _someObjects = value;
        }
    }

    private List<AnotherObject> _anotherObjects;
    public List<AnotherObject> AnotherObjects
    {
        get
        {
            if(_anotherObjects == null)
            {
                _anotherObjects= LoadAnotherObjectsFromDB();
            }
            return _anotherObjects ;
        }
        set
        {
            _anotherObjects = value;
        }
    }
}
导致

{
  "ID": 1,
  "field1": "field 1",
  "field2": "field 2",
  "SomeObjects": [
    {
      "ID": 1,
    },
    {
      "ID": 2,
    },
    {
      "ID": 3,
    }
  ],
  "AnotherObjects": [
    {
      "ID": 4,
    },
    {
      "ID": 5,
    },
    {
      "ID": 6,
    }
  ]
}
然后将其反序列化

MyObject obj = JsonConvert.DeserializeObject(memento, typeof(MyObject));
我得到一个由以下JSON表示的对象

{
  "ID": 1,
  "field1": "field 1",
  "field2": "field 2",
  "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
AnotherObjects
列表中的项目太多

SomeObjects
getter被调用,这会导致从数据库初始化列表,然后将序列化列表附加到数据库中。给我留下的列表中的项目比预期的多。但是如果我删除延迟加载部分

public List<SomeObject> SomeObjects
{
    get
    {
        /*if(_someObjects == null)
        {
            _someObjects = LoadSomeObjectsFromDB();
        }*/
        return _someObjects;
    }
    set
    {
        _someObjects = value;
    }
}
public列出一些对象
{
得到
{
/*如果(_someObjects==null)
{
_someObjects=LoadSomeObjectsFromDB();
}*/
返回一些对象;
}
设置
{
_someObjects=值;
}
}
getter仍然被调用,但返回null。然后,json.net调用setter,其
值为一个已添加元素数正确的列表,而如果getter返回一个初始化列表,它将附加到setter,而从不调用setter。为什么会出现差异,如果列表已经初始化,则调用getter并将其附加到。但如果未初始化,则调用setter,并使用已填充对象的列表对其进行初始化。有没有一种方法可以使json.net在反序列化泛型
列表时只调用setter?

json.net有一个用于此目的的设置。尝试将其设置为“替换”
,例如:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;

MyObject obj = JsonConvert.DeserializeObject<MyObject>(memento, settings);
JsonSerializerSettings设置=新建JsonSerializerSettings();
settings.ObjectCreationHandling=ObjectCreationHandling.Replace;
MyObject obj=JsonConvert.DeserializeObject(memento,设置);

演示:

阿当,我不觉得自己很笨吗?@AndrewHitaker嘿,别担心;如果您不知道设置,那么转换器实际上是一个不错的解决方案。
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ObjectCreationHandling = ObjectCreationHandling.Replace;

MyObject obj = JsonConvert.DeserializeObject<MyObject>(memento, settings);