Я использую XmlSerializer с StreamWriter следующим образом:
...
string xmlFile = GetXMLLocation(objToSaveType);
XmlSerializer Serializer = new XmlSerializer(objToSaveType);
using (StreamWriter sw = new StreamWriter(xmlFile))
Serializer.Serialize(sw, objToSave);
...
Это работает в подавляющем большинстве случаев, но редко сгенерированный файл заполнен нулевыми символами, и время от времени вызывающий нарушение файл заканчивается только нулевыми символами, например.
...
<Extension>0</Extension>
</OrderProductLine>
<OrderProductLine>
<ProductDescription />
<Commission>0.3</Commission>
<UnitType />
<UnitPrice>0</UnitPrice>
<UnitQuantity>0</UnitQuantity>
<PackageType />
<Extension>0</Extension>
[null x ~1 million]
Мне никогда не удавалось воспроизвести это самому. Он не генерирует никаких ошибок при сериализации и, кажется, возникает только во время завершения работы программы.
Связанные вопросы:
- здесь - очевидное исправление, писатель не сбрасывается; Я использую
using
, который вызывает Dispose (), который аналогичен Close () - здесь - лучший ответ предполагает, что ошибка была пропущена; мой не генерирует ошибок; пустой файл и файл, заполненный нулями, - это не одно и то же. Тем не менее, один из ответов предполагает, что это проблема кеширования.
Я изменил свой код следующим образом, если идея проблемы с кешированием верна:
string xmlFile = GetXMLLocation(objToSaveType);
XmlSerializer Serializer = new XmlSerializer(objToSaveType);
using (Stream file = new FileStream(xmlFile, FileMode.Create,
FileAccess.Write, FileShare.None,
0x1000, FileOptions.WriteThrough))
using (StreamWriter sw = new StreamWriter(file))
Serializer.Serialize(sw, objToSave);
У меня есть несколько идей по обходным путям (в основном, десериализация сразу после сохранения, откат или повторная попытка, если есть проблема), но было бы здорово исправить эту чертову вещь. Поскольку это настолько прерывисто, я еще не знаю, исправило ли это вышеупомянутое или нет. Этот пост предназначен либо для того, чтобы сообщить другим, кто находится в аналогичной ситуации, о возможном исправлении, либо для получения идей по другим возможным причинам. Спасибо за прочтение. (P.S. Первый пост SO, извините, если я нарушил какие-либо протоколы!)
Обновление: чуть больше недели спустя ошибка еще не появилась. Мои пальцы скрещены, хотя мне действительно понадобится около месяца, чтобы с достаточной уверенностью узнать, исправляет ли это ситуацию.
Обновление: две с половиной недели спустя, все еще хорошо.
Надеюсь, последнее обновление: через месяц все еще хорошо. В конце концов, кеширование, кажется, было проблемой, ура!