BinaryFormatter不会覆盖/更新序列化的项目

时间:2018-11-19 06:57:09

标签: c# unity3d serialization

我尝试使用binaryFormatter作为一种方法来保存和加载游戏中所有类型的数据(帐户,得分),这些数据是包含字段和/或列表的结构。事实是,序列化后似乎不会覆盖或更新文件中的数据。

例如,我创建一个包含两个PlayerAccounts的List并将其序列化。为了更加谨慎地进行测试,我将反序列化为新的Playeraccounts列表。第一次将数据序列化就很好,但是当我将另一个帐户添加到列表中并再次序列化时,似乎看不到更改。也许我已经搜索了这个问题,但似乎我错过了一些东西。

因为涉及到很多代码,所以我只是创建了一个简单的保存并加载,然后尝试使用int列表进行覆盖以执行相同的操作,所以我猜它可以作为替代。

这是主要代码:

string path = Application.persistentDataPath + "/mEs.binary";

FileStream fsWrite = new FileStream(path, FileMode.Append, FileAccess.Write);

BinaryFormatter bf = new BinaryFormatter();

List<int> input = new List<int> { 1, 2, 3, 4 };

bf.Serialize(fsWrite, input);

fsWrite.Close();

FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read);

List<int> output = (List<int>)bf.Deserialize(fsRead);

fsRead.Close();

print("first entry:");

foreach (int entry in output)
{
    print(entry);
    //prints 1 to 4
}

input = output;

input.Add(5);

fsWrite = new FileStream(path, FileMode.Append, FileAccess.Write);

bf.Serialize(fsWrite, input); //add the updated List of ints

fsWrite.Close();

fsRead = new FileStream(path, FileMode.Open, FileAccess.Read);

output = (List<int>)bf.Deserialize(fsRead);

print("second entry:");

foreach (int entry in output)
{
    print(entry);
    //prints 1 to 4 again (instead of 1 to 5)
}

1 个答案:

答案 0 :(得分:0)

正如@Alexei Levenkov提到的那样,问题是在写入流时使用FileMode.Append。它将新列表(1..5)附加到文件末尾。

如果尝试从文件中读取第二个列表(在示例中两次使用output = (List<int>)bf.Deserialize(fsRead);),则可以进行测试。第一次读取将创建1..4的列表,第二次读取将创建1..5的列表。

使用FileMore.Create代替FileMode。追加以覆盖(旧)现有文件。