间歇性XmlSerializer(部分)空文件

时间:2012-07-24 01:30:02

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

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

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

相关问题:

  • here - 显而易见的解决方法,作家没有冲动;我正在使用调用Dispose()的using,它与Close()
  • 相同
  • 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. First SO post,对不起,如果我已经破坏了任何协议!)

更新:一个多星期后,这个漏洞还没有再出现。我的手指交叉,但我真的需要大约一个月的时间才能确切地知道这件事情是否已解决。

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

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

1 个答案:

答案 0 :(得分:0)

我和同事谈过我们在申请中解决这个问题的方法。

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

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