У меня странный случай - у нескольких клиентов бывает, что файл конфигурации, сохраненный во время выполнения с использованием XmlSerializer, сохраняется как последовательность нулей (байты со значением 0). Длина файла - это ожидаемый размер файла для данного XML-вывода (около 350 байт).
Это код, используемый для сериализации файла:
XmlSerializer s = new XmlSerializer(this.GetType());
using (StreamWriter sw = new StreamWriter(File.Create(path), Encoding.Default))
{
s.Serialize(sw, this, new XmlSerializerNamespaces());
}
Модель файла конфигурации проста - класс с автоматическими свойствами типа string, bool, DateTime и одним свойством типа перечисления.
File.Create
с последующим сбоем не вызывает этого - если я делаю File.Create в существующем файле, он просто устанавливает его длину равным нулю.throw new Exception()
s.Serialize call
throw new Exception()
перед s.Serialize call
- также не файл виновника обрезается до нулевой длиныЧто может заставить XmlSerializer выводить нули вместо реального XML?
Я нашел аналогичный вопрос с идеальным ответом, соответствующим моим симптомам:
От Малькольма:
Мы столкнулись с этой проблемой несколько раз в $ WORK, причем симптом был пустым файлом нужного размера, но заполненным нулевыми байтами.
Решение, которое мы нашли, это установить значение WriteThrough в FileStream:
using (Stream file = new FileStream(settingTemp, FileMode.Create,
FileAccess.Write, FileShare.None,
0x1000, FileOptions.WriteThrough))
{
using (StreamWriter sw = new StreamWriter(file))
{
...
}
}
Оригинальный ответ на qaru.site/questions/1424796/...
Просто; это не должно. То, что вы описали, является нетипичным. Вы можете попытаться более подробно узнать об этом файле:
using (var file = File.Create(path))
using (StreamWriter sw = new StreamWriter(file, Encoding.Default))
{
s.Serialize(sw, this, new XmlSerializerNamespaces());
}
Однако я бы ожидал, что ваш существующий код будет работать. Есть ли полностью воспроизводимый пример, демонстрирующий генерирование всего нуля?
Несвязанный, но Encoding.Default
практически никогда не является правильным выбором. Не используйте это. UTF-8, вероятно, является вашим лучшим дефолтом.
Я бы посмотрел на такие вещи, как антивирус, неисправный контроллер диска и т.д.