Будет ли XmlSerializer создавать пустые документы

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

Большинство машин, которые использовали этот код, используют его примерно на год, если не больше. Пустые файлы, используемые для хранения данных и списков в них. Файлы не сериализуются одновременно. Сохранение / сериализация один за другим до выхода программы.

Мои вопросы: возможно ли, что код ниже создает пустой файл? Что еще может привести к их внезапному пусту? У кого-нибудь еще были проблемы с XML-сериализатором в прошлом месяце? (Эта проблема произошла только в прошлом месяце на assemblyх, которые были стабильными в течение 3 месяцев).

Если у вас есть вопросы или я чего-то прошу прошу. Существует также множество типов, которые я сериализую … поэтому, если вы можете себе это представить, я, вероятно, имею нечто похожее, которое сериализуется.

public class BackEnd { public string FileSaveLocation = "this gets set on startup"; public bool DisabledSerial; public virtual void BeforeDeserialize() { } public virtual void BeforeSerialize() { } public virtual void OnSuccessfulSerialize() { } protected virtual void OnSuccessfulDeserialize(ListBackEnd tmpList) { } protected virtual void OnDeserialize(ListBackEnd tmpList) { } public virtual void serialize() { if (DisabledSerial) return; try { BeforeSerialize(); using (TextWriter textWrite = new StreamWriter(FileSaveLocation)) { (new XmlSerializer(this.GetType())).Serialize(textWrite, this); Debug.WriteLine(" [S]"); textWrite.Close(); } OnSuccessfulSerialize(); } catch (Exception e) { Static.Backup.XmlFile(FileSaveLocation); Log.ErrorCatch(e, "xml", "serialize - " + typeof(T) + " - " + (new FileInfo(FileSaveLocation)).Name); } } public virtual object deserialize(TextReader reader) { if (this.DisabledSerial) return false; ListBackEnd tmp = null; this.BeforeDeserialize(); if (reader == null && !File.Exists(this.FileSaveLocation)) { Log.Write(Family.Error, "xml", "deserialize - " + this.GetType() + " - file not found. " + (new FileInfo(FileSaveLocation)).Name); } else { try { using (TextReader textRead = ((reader == null) ? new StreamReader(this.FileSaveLocation) : reader)) { tmp = (ListBackEnd)this.get_serializer().Deserialize(textRead); Debug.WriteLine(" [D]"); textRead.Close(); } OnSuccessfulDeserialize(tmp); if (tmp != null) { this._Items = tmp._Items; this.AutoIncrementSeed = tmp.AutoIncrementSeed; if (this._Items.Count > this.AutoIncrementSeed && this._Items[0] is ItemStorage) this.AutoIncrementSeed = this._Items.Max(item => (item as ItemStorage).Key); } } catch (Exception e) { // this only copies the file Static.Backup.XmlFile(FileSaveLocation); // this only logs the exception Log.ErrorCatch(e, "xml", "deserialize - " + typeof(T) + " - " + (new FileInfo(FileSaveLocation)).Name); } } //{ Log.ErrorCatch(e, "xml", "deserialize" + this.GetType() + " - " + this.FileSaveLocation); } OnDeserialize(tmp); tmp = null; return (_Items.Count > 0); } } 

Единственная причина, по которой я могу думать, что это произойдет, это то, что эта строка:

 (new XmlSerializer(this.GetType())).Serialize(textWrite, this); 

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

Что значит

 Static.Backup.XmlFile(FileSaveLocation); 

делать?

Мы столкнулись с этой проблемой несколько раз в $ WORK, причем симптом был пустым файлом нужного размера, но заполненным нулевыми байтами.

Решение, которое мы нашли, это установить значение WriteThrough в FileStream:

 using (Stream file = new FileStream(settingTemp, FileMode.Create, FileAccess.Write, FileShare.None, 0x1000, FileOptions.WriteThrough)) { using (StreamWriter sw = new StreamWriter(file)) { ... } }