2014-02-27 84 views
0

我的應用程序在XML文件打開時反序列化數據。在反序列化工作正常第一次加載應用程序,但是當我嘗試重新打開該程序,我得到以下錯誤:XML重新反序列化錯誤

2/27/2014 6:27:30 PM : Error: There is an error in XML document (9, 6).. Stacktrace: at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at XMLInterface.XMLInterface.Deserialize(String CallingSub, String LocalFileURI) in C:\AzTech\Satellite\Code Repository\trunk\Ribbon\XMLInterface\Code\XMLInterface.vb:line 66 

此外,應用程序是一個附加的解決方案的一部分,這樣當應用程序關閉,加載項仍在運行。如果我關閉加載項並重新運行它,序列化工作正常;只有在我關閉並重新打開應用程序後,纔會發生錯誤。

這裏是我的代碼:

 Dim ser As New XmlSerializer(ElementsLocal.GetType) 
     Dim objStreamReader As New StreamReader(LocalFileURI) 
     ElementsLocal = ser.Deserialize(objStreamReader) 
     objStreamReader.Close() 
     objStreamReader.Dispose() 
     ser = Nothing 
     GC.Collect() 

有沒有人有什麼想法?我需要以某種方式發佈文件嗎?我認爲,一旦反序列化小組退出文件將被釋放,但是情況並非如此?

編輯:

For Each Name As String In System.IO.Directory.GetFiles(My.Settings.savePath) 
     Dim cBox As New ComboBoxItem 
     cBox.Content = System.IO.Path.GetFileNameWithoutExtension(Name) 
     cBox.Style = TryFindResource("blackComboBoxItem") 
     cmbBxQBDNames.Items.Add(cBox) 
    Next 

編輯2: 該文件是由這些過程以及(不知道這是否會影響到的情況)來訪問 包裝紙的代碼,如建議,做也不行:

 Dim ser As New XmlSerializer(ElementsLocal.GetType) 
     Using fs As FileStream = New FileStream(LocalFileURI, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
      Using objStreamReader As New StreamReader(fs) 
       ElementsLocal = ser.Deserialize(objStreamReader) 
      End Using 
     End Using 
     ser = Nothing 
+0

發生整個錯誤會很有幫助,而不僅僅是堆棧跟蹤。 –

+0

我早先放入了整個錯誤信息,但它被其他人編輯了出來。 – user

+0

它看起來像一個堆棧跟蹤轉儲到日誌文件。我指的是整個錯誤,告訴你哪裏出了問題,哪裏(我們已經有這個部分)。 –

回答

0

的問題是,當您打開使用的StreamReader的文件,它鎖定從正在使用的其他工藝文件ES。這包括您在啓動第二個實例時的應用程序,並且第一個未完全耗盡內存。試試這段代碼:

Dim ser As New XmlSerializer(ElementsLocal.GetType) 
Using fs As FileStream = New FileStream(LocalFileURI, _ 
             FileMode.Open, _ 
             FileAccess.Read, _ 
             FileShare.ReadWrite) 
    Using objStreamReader As New StreamReader(fs) 
     ElementsLocal = ser.Deserialize(objStreamReader) 
    End Using 
End Using 
ser = Nothing 
GC.Collect() 

Using語句定義了一個你想要清理的對象。在End Using行處,編譯器將在Using行中創建的對象的Dispose(它也將爲您關閉)。如果您正在處理文件,網絡流或其他應用程序,但一次只能處理一件事,那麼Using聲明是一個不錯的選擇。

FileStream對象爲您提供了一種打開具有不同訪問級別的文件以最小化(或最大化)與其他進程的干擾的方法。您只想打開現有文件,而不是創建或追加 - FileMode。你不需要對這個文件做任何事情,除了閱讀它的內容 - FileAccess。您想盡量減少可能需要訪問該文件的其他進程的問題 - FileShare

+0

此解決方案看起來很有希望,但它沒有解決錯誤 - 我仍然得到一個「Object Reference ...」消息。 – user

+0

您的代碼的其他部分是否打開相同的文件?如果是這樣,您將需要做類似的事情來防止文件鎖定問題。 –

+0

我發現的唯一其他代碼以我作爲編輯添加的某種方式訪問​​文件。這些過程會影響這種情況嗎? – user