2012-07-24 35 views
4

我使用的是一個StreamWriter一個XmlSerializer如下:間歇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 - 明顯修復,作家是不沖水;我正在使用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貼,對不起,如果我打破任何協議!)

更新:一個多星期後,該錯誤還沒有重新出現。我的手指交叉着,雖然我真的需要大約一個月的時間來合理確定地知道這些固定的東西。

更新:兩個半星期後,還是不錯的。

希望最後更新:一個多月後,仍然不錯。好吧,緩存似乎成了問題!

+1

我們也看到了這個錯誤;它主要發生在「現場」(我們注意到,當客戶抱怨他們丟失了數據)。你使用哪個版本的.Net? – habakuk 2012-08-03 10:12:00

+0

@habakuk我正在使用.NET 4.0。 – jemidiah 2012-08-03 21:39:33

回答

0

我和同事談了我們在我們的應用程序中解決了這個問題。

當應用程序關閉時,我們保存了一些xml數據,看起來有時線程將文件寫入磁盤被應用程序關閉進程終止。

我們將保存命令從應用程序關閉移至數據更改的時間。這解決了我們的問題。

+0

我其實沒有效果,這讓我很驚訝。具體來說,我將Application_Exit事件中的shutdown save調用移至了我的主啓動屏幕的Window_Closing事件 - 應用程序的設置迫使您通過這一個地方關閉。這是次優的,但恰巧在我的情況下工作。順便說一句,它確實解決了另一個問題:在App_Exit中創建一個新窗口很少發生錯誤。 – jemidiah 2012-08-03 21:50:05