我尝试使用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)
}
答案 0 :(得分:0)
正如@Alexei Levenkov提到的那样,问题是在写入流时使用FileMode.Append。它将新列表(1..5)附加到文件末尾。
如果尝试从文件中读取第二个列表(在示例中两次使用output = (List<int>)bf.Deserialize(fsRead);
),则可以进行测试。第一次读取将创建1..4的列表,第二次读取将创建1..5的列表。
使用FileMore.Create代替FileMode。追加以覆盖(旧)现有文件。