4

我正在使用带有 StreamWriter 的 XmlSerializer,如下所示:

...
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]

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

相关问题:

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

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

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);

我有一些解决方法的想法(主要是在保存后立即反序列化、回滚或在出现问题时重试),但修复该死的东西会很棒。由于它是如此断断续续,我还不知道上面是否修复了它。这篇文章要么是为了告知其他处于类似情况的人可能的修复方法,要么是为了获得其他可能原因的想法。谢谢阅读。(PS First SO post,对不起,如果我破坏了任何协议!)

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

更新:两周半后,仍然很好。

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

4

1 回答 1

0

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

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

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

于 2012-08-03T12:21:47.127 回答