gpt4 book ai didi

c# - XmlSerializer 会创建空文档吗

转载 作者:行者123 更新时间:2023-11-30 19:21:05 25 4
gpt4 key购买 nike

好吧,下面的代码我已经投入生产一年多了,没有任何变化。它一直运作良好。在过去一个月内,多台机器报告 xml 文档完全为空。它们甚至不包含 xml header 。我无法复制突然变空的文件,也无法提出实现它的方法。我希望有人遇到过他们解决的类似问题。

大多数使用此代码的机器已经使用了大约一年,甚至更多。空文件过去常常包含数据和列表。这些文件不会同时序列化。程序退出前依次保存/序列化。

我的问题:下面的代码是否可以创建一个空文件?还有什么会导致它们突然变空?在过去的一个月里,还有其他人遇到过 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);
}
}

最佳答案

我们在 $WORK 遇到过几次这个问题,症状是一个大小正确但填充了零字节的空文件。

我们找到的解决方案是在 FileStream 上设置 WriteThrough 值:

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

关于c# - XmlSerializer 会创建空文档吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com