Ошибка с сериализованным файлом: двоичный поток ‘0’ не содержит допустимого двоичного заголовка

#c# #serialization #binaryformatter

#c# #сериализация #binaryformatter

Вопрос:

У меня очень странная проблема, которая полностью сбивает меня с толку. Любая помощь будет принята с благодарностью.

У меня есть файл сохранения, который я записываю со следующим кодом:

         using (FileStream fs = File.Open(SavePath, FileMode.Create, FileAccess.Write))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, SaveData);
        }
  

Для большинства пользователей это работает нормально, и для меня это всегда работает отлично. Но менее чем для 1% моих пользователей этот код записывает файл, в котором есть только нули. Он имеет точно такой же размер файла, файл просто заполнен нулями вместо фактических данных из класса. Класс существует в памяти, не задействованы базы данных или подключения к Интернету.

Проблема постоянно возникает для этих пользователей, но никогда для других. Все выполняют точно такой же код. У кого-нибудь есть какие-либо идеи, что может привести к этому? Должно быть что-то конкретное в компьютерах этих пользователей, что приводит к постоянному сбою.

Расположение сохранения файла находится в: C:Users [ИМЯ ПОЛЬЗОВАТЕЛЯ]AppDataLocalLowПапка программы

Комментарии:

1. Файл заполнен нулями? Очень распространенная вещь для всех видов нехватки питания, антивирусов и кэшей. Ошибка не имеет значения, поскольку вы знаете, что содержимое неверно. Вы можете реализовать стратегию резервного копирования, например, переименовать предыдущие успешно десериализованные файлы в bak перед сохранением новых. Другим улучшением является сериализация в tmp-файл и быстрое переименование после.

2. Я не думал, что причиной этого может быть антивирус. Это, по крайней мере, имело бы некоторый смысл, исходя из того, как это последовательно влияет на некоторых пользователей, а на других — нет. Многие из затронутых пользователей являются новыми пользователями, поэтому для них нет успешно сериализованных файлов, но запись его temp и переименование могут сработать. Спасибо за совет.

3. Как насчет версии Net? Метод сериализации может измениться в разных версиях Net. Microsoft не заботится о прямой обратной совместимости пользовательского программного обеспечения и часто меняет значения по умолчанию внутри Net с новыми выпусками. Я видел это раньше с двоичной сериализацией. Также пользователи, если они изменяют объект, который они сериализуют, не могут десериализовать после изменения размера / свойств объекта.

4. Я проверю . Сетевые версии для затронутых пользователей тоже, но правильный распространяемый файл должен быть установлен в качестве предварительного условия для моего приложения.