BinaryFormatter не перезаписывает / обновляет сериализованный элемент - PullRequest
0 голосов
/ 19 ноября 2018

Я попытался использовать двоичный формат как метод сохранения и загрузки всех типов данных в моей игре (учетные записи, оценки), которые представляют собой структуры, содержащие поля и / или списки.Дело в том, что он не перезаписывает и не обновляет данные в файле после сериализации.

Например, я создаю список, содержащий два аккаунта игрока, и сериализую его.Чтобы быть особенно осторожным при тестировании, я десериализован в новый список Playeraccounts.В первый раз данные сериализуются просто отлично, но когда я добавляю другую учетную запись в список и снова сериализую ее, изменения, кажется, не замечаются.Может быть, я искал проблему, но, кажется, я что-то упустил.

Поскольку в нем задействовано много кода, я просто создал простое сохранение и загрузку, а затем попытался перезаписать его с помощью Списка целых чисел, что делает то же самое, поэтому я думаю, что он служит подстановкой.

вот основной код:

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 голосов
/ 19 ноября 2018

Как отметил @Aleeei Levenkov, проблема заключается в использовании FileMode.Append при записи потокаДобавляет новый список (1..5) в конец файла.

Вы можете проверить это, если попытаетесь прочитать второй список из файла (дважды используйте output = (List<int>)bf.Deserialize(fsRead); в вашем примере).Первое чтение создаст список 1..4, второе чтение списка 1..5.

Используйте FileMore.Create вместо FileMode.Append, чтобы переопределить (старый) существующий файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...