好的,以下代码我已经生产了一年多没有变化。它一直运作良好。在过去一个月内,少数机器报告xml文档完全为空。它们甚至不包含xml标头。我无法复制突然变空的文件,也无法建议它发生的方式。我希望有人有类似的问题,他们解决了。
使用此代码的大多数机器已经使用了大约一年,如果不是更多的话。用于在其中包含数据和列表的空文件。文件不会同时序列化。在程序退出之前,一个接一个地保存/序列化。
我的问题: 下面的代码是否可以创建一个空文件? 还有什么会导致他们突然变空? 有没有其他人在过去一个月中遇到过XML-serializer的问题? (这个问题仅发生在过去一个月中已稳定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);
}
}
答案 0 :(得分:7)
我们在$ WORK遇到过这个问题几次,症状是一个大小正确的空文件但填充零字节。
我们找到的解决方案是在FileStream上设置WriteThrough值:
using (Stream file = new FileStream(settingTemp, FileMode.Create,
FileAccess.Write, FileShare.None,
0x1000, FileOptions.WriteThrough))
{
using (StreamWriter sw = new StreamWriter(file))
{
...
}
}
答案 1 :(得分:3)
我认为会发生这种情况的唯一原因是这一行:
(new XmlSerializer(this.GetType())).Serialize(textWrite, this);
抛出异常并创建和处理文本编写器,而不会写入任何内容。我会查看你的日志中的错误。
什么是
Static.Backup.XmlFile(FileSaveLocation);
办?