【问题标题】:Intermittent XmlSerializer (partially) null file间歇性 XmlSerializer(部分)空文件
【发布时间】:2012-07-22 07:12:27
【问题描述】:

我正在使用 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]

我自己从来没有复制过它。它在序列化时不会产生任何错误,并且似乎只在程序关闭时发生。

相关问题:

  • here - 明显的修复,作家没有冲洗;我正在使用using,它调用与 Close() 相同的 Dispose()
  • here - 最佳答案假设有错误被遗漏;我的不会产生错误;空文件和一个用空值填充的文件是不一样的。尽管如此,其中一个答案表明这是一个缓存问题。

如果缓存问题的想法是正确的,我已经修改了我的代码:

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 帖子,如果我违反了任何协议,请见谅!)

更新:一个多星期后,该错误尚未再次出现。我的手指交叉,虽然我真的需要大约一个月才能合理确定地知道这是否解决了问题。

更新:两周半后,还是不错的。

希望最终更新:一个多月后,仍然很好。毕竟缓存似乎是个问题,耶!

【问题讨论】:

  • 我们也看到了这个错误;它主要发生在“现场”(我们注意到它,当客户抱怨他们丢失了数据时)。您使用哪个版本的 .Net?

标签: .net c#-4.0 xml-serialization streamwriter


【解决方案1】:

我与一位同事讨论了我们为在应用程序中解决此问题所做的工作。

我们在应用程序关闭时保存了一些xml数据,看起来有时将文件写入磁盘的线程被应用程序关闭进程杀死了。

我们将保存命令从应用程序关闭移至数据更改时。这为我们解决了问题。

【讨论】:

  • 我实际上试过没有效果,这让我很惊讶。具体来说,我将关闭保存调用从 Application_Exit 事件移到了我的主启动屏幕的 Window_Closing 事件——应用程序的设置迫使您通过这个地方关闭。这是次优的,但在我的情况下恰好有效。顺便说一句,它确实解决了另一个问题:在 App_Exit 中创建新窗口很少会引发错误。
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多