C# 重复的序列化和反序列化会创建重复项

C# 重复的序列化和反序列化会创建重复项,c#,json,serialization,unity3d,json.net,C#,Json,Serialization,Unity3d,Json.net,大家好,我的json序列化有问题。我正在Unity下使用Json.NET包:我正在搜索一个数据库,在我的应用程序上可编辑,并通过wwwForm和一个php文件存储在我的服务器上。我没有问题去创造它,并把它推到网上。问题是,当我加载它时,数据库的末尾有一个新条目。数据库类如下所示: public class Database { public List<Army> armies { get; set;} public Database() { ar

大家好,我的json序列化有问题。我正在Unity下使用Json.NET包:我正在搜索一个数据库,在我的应用程序上可编辑,并通过wwwForm和一个php文件存储在我的服务器上。我没有问题去创造它,并把它推到网上。问题是,当我加载它时,数据库的末尾有一个新条目。数据库类如下所示:

public class Database   {
    public List<Army> armies { get; set;}

    public Database() {
        armies = new List<Army>();
        armies.Add (new Army());
    }
}

public class Army
{
    public string faction { get; set;}
    public List<Unit> army { get; set;}

    public Army()
    {
        faction = "RED";
        army = new List<Unit>();
        army.Add (new Unit());
    }
}

public class Unit
{
    public string name { get; set;}
    public float fissionTimer { get; set;}
    public float HP { get; set;}
    public int shield { get; set;}
    public float strenght { get; set;}
    public float movSpeed { get; set;}
    public float attackSpeed { get; set;}
    public float farmAggro { get; set;}
    public int criticPossibility { get; set;}
    public int armorPenetration { get; set;}
    public bool isContagious { get; set;}
    public int contagePossibility { get; set;}
    public string imgName {get;set;}

    public Unit()
    {
        name = "standard";
        fissionTimer = 8;
        HP = 100;
        shield = 0;
        strenght = 10;
        movSpeed = 5;
        attackSpeed = 0.1f;
        farmAggro = 0.1f;
        criticPossibility = 0;
        armorPenetration = 0;
        isContagious = false;
        contagePossibility = 0;
        imgName = "Red";
    } 

    public Unit(string _name, float _fissionTimer, float _HP, int _shield, float _strenght, float _movSpeed, float _attackSpeed, 
                float _farmAggro, int _criticPossibility, int _armorPen, bool _iscontagious, int _contagePos, string _imgName)
    {
        name = _name;
        fissionTimer = _fissionTimer;
        HP = _HP;
        shield = _shield;
        strenght = _strenght;
        movSpeed = _movSpeed;
        attackSpeed = _attackSpeed;
        farmAggro = _farmAggro;
        criticPossibility = _criticPossibility;
        armorPenetration = _armorPen;
        isContagious = _iscontagious;
        contagePossibility = _contagePos;
        imgName = _imgName;
    }
}

有2个军队和2个单位。我哪里做错了?提前感谢

发生这种情况的原因是两件事的结合:

  • 类构造函数会自动将默认项添加到各自的列表中。Json.Net在反序列化期间调用这些构造函数来创建对象实例
  • Json.Net的默认行为是在反序列化期间重用(即添加到)现有列表,而不是替换它们
  • 要解决这个问题,您可以更改代码,使构造函数不会自动将默认项添加到列表中,或者配置Json.Net以在反序列化时替换列表,而不是重用它们。后者可通过将设置更改为
    Replace
    来完成,如下所示:

    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
    
    var database = JsonConvert.DeserializeObject<Database>(www.text, settings);
    
    JsonSerializerSettings设置=新建JsonSerializerSettings();
    settings.ObjectCreationHandling=ObjectCreationHandling.Replace;
    var database=JsonConvert.DeserializeObject(www.text,settings);
    
    最好的方法是将JSON.Net配置为将默认值替换为

    JsonSerializerSettings   jsSettings =  new JsonSerializerSettings
    {
      ObjectCreationHandling = ObjectCreationHandling.Replace,
    };
    
    JsonConvert.DeserializeObject<Army>(jsonString, jsSettings);
    
    JsonSerializerSettings jsSettings=新的JsonSerializerSettings
    {
    ObjectCreationHandling=ObjectCreationHandling.Replace,
    };
    反序列化对象(jsonString、jsSettings);
    
    如果要在构造函数中添加默认项,请尝试删除它们。但我只添加了一项。我这样测试:Database test=newdatabase()//伪代码test.armies.count=1(正确)serialize-save-load-deserialize(不修改数据库test.arms.count?=2…为什么是2?另请参阅:FWIW我使用哈希集修复了它,因此不允许重复值(在我的例子中是枚举)。Thx很多,我只是删除了每个构造函数上的.add,就解决了它,但你教我json序列化是如何工作的;)有用且很好的回答,再次谢谢
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
    
    var database = JsonConvert.DeserializeObject<Database>(www.text, settings);
    
    JsonSerializerSettings   jsSettings =  new JsonSerializerSettings
    {
      ObjectCreationHandling = ObjectCreationHandling.Replace,
    };
    
    JsonConvert.DeserializeObject<Army>(jsonString, jsSettings);