«первопричина» - люди, выключающие компьютеры без надлежащего закрытия окон.
о, следующий код, который я имел в производстве более года без изменений. Это работало довольно хорошо. За последний месяц более чем несколько машин сообщают, что XML-документы полностью пусты. Они даже не содержат заголовок xml. Я не могу дублировать файлы, которые внезапно становятся пустыми, и не могу предложить способ, чтобы это произошло. Я надеюсь, что у кого-то была похожая проблема, которую они решили.
Большинство машин, которые использовали этот код, использовали его около года, если не больше. Пустые файлы имели данные и списки в них. Файлы не сериализуются одновременно. Сохранение / сериализация один за другим до выхода из программы.
Мои вопросы: возможно ли с помощью кода ниже создать пустой файл? Что еще заставит их внезапно опустеть? У кого-нибудь еще были проблемы с XML-сериализатором в прошлом месяце? (Эта проблема возникла только в прошлом месяце на сборках, которые были стабильными в течение 3+ месяцев.)
Если у вас есть вопросы или я что-то упустил, спросите, пожалуйста. Также существует большое разнообразие типов, которые я сериализую ... так что, если вы можете себе это представить, у меня, вероятно, есть нечто подобное, которое сериализуется.
public class BackEnd<T> {
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<T> tmpList) { }
protected virtual void OnDeserialize(ListBackEnd<T> 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<T> 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<T>)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);
}
}