2014-11-04 44 views
1

我有一個奇怪的情況 - 它發生在一些客戶使用XmlSerializer在運行時保存的配置文件保存爲零序列(值爲0的字節)。文件長度是給定XML輸出的預期文件大小(大約350字節)。爲什麼XmlSerializer將對象序列化爲包含零而不是XML的文件?

這是用於序列化的文件中的代碼:

XmlSerializer s = new XmlSerializer(this.GetType()); 
using (StreamWriter sw = new StreamWriter(File.Create(path), Encoding.Default)) 
{ 
    s.Serialize(sw, this, new XmlSerializerNamespaces()); 
} 

配置文件模型簡單 - 與類型字符串,布爾,DateTime和枚舉類型的一個屬性的自動屬性的類。

  • 我相信File.Create一些後續的故障不會導致此 - 如果我這樣做File.Create上的現有文件,它只是將它的長度爲零。
  • 我試過s.Serialize call之前加入throw new Exception()聲明 - 也不是罪魁禍首 - 文件被調整到零長度

什麼引起的XmlSerializer輸出零,而不是實際的XML?

+0

在序列化沒有例外原來的答覆? – Reniuz 2014-11-04 09:38:48

+0

不幸的是,當發生這種情況時我無法訪問日誌,所以我不知道是否有異常。我只能訪問全部爲零的配置文件,顯然不能反序列化。 – Marek 2014-11-04 09:43:51

+0

馬克可能是正確的[默認編碼](https://social.msdn.microsoft.com/Forums/en-US/5e461f33-de14-46a0-bdb0-fbaeaf409afb/xmlserializer-creating-blank-files?forum=asmxandxml ) – Reniuz 2014-11-04 10:01:46

回答

0

我發現了一個類似的問題,有一個完美的答案符合我的症狀:

從馬爾科姆:

我們已經遇到了這個問題,在$ WORK,幾次與 症狀是正確的大小的空文件,但以0 字節。

我們找到解決的辦法是設置在 的FileStream的直寫值:

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

https://stackoverflow.com/a/8858975/163393

+0

這可能是因爲發生了某些磁盤錯誤並且磁盤無法將緩存中的內容寫入磁盤?磁盤故障,崩潰,沒有powerloss保護的ssd等。WriteThrough將強制寫入器直接寫入磁盤,而不是使用磁盤緩存來提高性能。 – ferdyh 2016-11-15 09:22:16

+0

如果這樣可以解決問題,那麼很可能系統在沒有正確關閉的情況下會斷電,並且磁盤緩存未被刷新。我認爲@Ferdy是對的。 – 2017-11-03 20:26:54

0

簡單地;它不應該。你描述的是非典型的。你可以嘗試更加明確擁有的文件:

using (var file = File.Create(path)) 
using (StreamWriter sw = new StreamWriter(file, Encoding.Default)) 
{ 
    s.Serialize(sw, this, new XmlSerializerNamespaces()); 
} 

不過,我希望你現有的代碼工作。是否有一個完全可重現的示例,演示生成全零輸出?

無關,但Encoding.Default幾乎從來沒有正確的選擇。不要使用它。 UTF-8可能是您最好的默認設置。

我會在看東西像防病毒,一個失敗的驅動器控制器,等...

+0

謝謝你的回答。由於StreamWriter.Dispose在底層流上調用Close,所以使用FileStream進行添加不會改變任何內容。我沒有一個可重複的例子,我沒有證據證明它是生成文件內容的XmlSerializer。這是隨機發生的,只發生在位於不同地點的少數客戶機器上。正如你所說 - 它可能是一種外部類似於防病毒的東西。我想確認在XmlSerializer中是否有任何代碼路徑會產生這種情況。我會嘗試用不同的編碼重現。 – Marek 2014-11-04 09:49:01

+0

@Marek編碼的東西是分開的,但很重要 - 它不會導致0的問題,但它可能會*損害你的純粹的編碼原因的線。 – 2014-11-04 09:51:33

+0

當我嘗試使用Encoding.GetEncoding(「x-EBCDIC-KoreanExtended」)時,它產生了難以辨認的字節序列(可能只是因爲我沒有安裝正確的字符集),但是我無法複製任何返回的編碼來自Encoding.GetEncodings。 – Marek 2014-11-04 10:01:58

相關問題