#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. Я проверю . Сетевые версии для затронутых пользователей тоже, но правильный распространяемый файл должен быть установлен в качестве предварительного условия для моего приложения.