Прерывистый нулевой файл XmlSerializer (частично)

Я использую 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, извините, если я нарушил какие-либо протоколы!)

Обновление: чуть больше недели спустя ошибка еще не появилась. Мои пальцы скрещены, хотя мне действительно понадобится около месяца, чтобы с достаточной уверенностью узнать, исправляет ли это ситуацию.

Обновление: две с половиной недели спустя, все еще хорошо.

Надеюсь, последнее обновление: через месяц все еще хорошо. В конце концов, кеширование, кажется, было проблемой, ура!


person Joshua P. Swanson    schedule 24.07.2012    source источник
comment
Мы тоже видели эту ошибку; в основном это происходило на местах (мы замечаем это, когда клиенты жалуются на потерю данных). Какую версию .Net вы используете?   -  person habakuk    schedule 03.08.2012


Ответы (1)


Я поговорил с коллегой, что мы сделали, чтобы исправить эту проблему в нашем приложении.

Мы сохранили некоторые XML-данные при завершении работы приложения, и похоже, что иногда поток, записывающий файл на диск, прерывается процессом завершения работы приложения.

Мы переместили команду сохранения из выключения приложения на время, когда данные были изменены. Это решило проблему для нас.

person habakuk    schedule 03.08.2012
comment
На самом деле я попробовал это безрезультатно, что меня удивило. В частности, я переместил вызов сохранения выключения из события Application_Exit в событие Window_Closing моего основного экрана запуска - настройка приложения заставляет вас закрыться через это единственное место. Это неоптимально, но в моем случае работает. Кстати, он исправил еще одну проблему: создание нового окна в App_Exit редко вызывало ошибку. - person Joshua P. Swanson; 04.08.2012