2013-10-21 53 views
1

我在VB.NET中的遺留系統中工作。它將數據存儲在本地XML文件中,通過使用XMLSerializer並傳入一個對象。爲了讀取數據,它以同樣的方式反序列化回對象。XML解串器命名空間與傳統文件的衝突

我們沒有顯式的模式或XML名稱空間。我知道這遠非理想,我知道如果我們改變任何屬性的名稱或順序,那麼我們會破壞向後兼容性。但是我們堅持使用這個基本系統和許多現有的文件,它必須能夠讀寫。

我還沒有觸及被序列化的對象的任何屬性。但我確實開始在應用程序的另一部分使用System.Drawing.Point。現在,當我試圖序列化或反序列化,我得到InvalidOperationException異常此消息:

類型「System.Windows.Point」和「System.Drawing.Point」都使用XML 類型名稱,「點」,來自命名空間''。使用 的XML屬性爲類型指定唯一的XML名稱和/或名稱空間。

我承認我不明白系統如何突然決定這種類型是不明確的。拋出錯誤的類的屬性被特別聲明爲System.Windows.Point。其他Point的任何實例在任何地方都是序列化或反序列化的。

我已經搜索了很多關於這個異常,但我看到所有的討論似乎都與Web服務和開發人員命名的類有關。答案似乎是「重命名您的類」,或者「使用XML屬性爲您的類型指定新的XML名稱空間」。

我想我不能做這些事情。我無法重命名System.Windows.Point。我無法更改系統期望寫入或讀取的任何標籤,因爲我無法使用過去寫入的任何文件來分解兼容性。

當我沒有做任何更改XML的操作時,這個錯誤是如何開始顯示的?我該如何解決這個問題,而不會影響我訪問現有XML文件的能力?

編輯: XML文件本身並不指向任何地方的「點」。 XML看起來像這樣:

<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Segment> 
     <ID>0</ID> 
     <Location> 
      <X>37</X> 
      <Y>330</Y> 
     </Location> 
     (other properties) 
    </Segment> 
    <Segment> 
    ..... 
</MyClass> 
+0

你能提供一個小代碼示例來演示這個問題嗎?和/或一個XML文件,它有一個點? – rene

+0

編輯提供了一個XML示例。我無法提供演示問題的小代碼示例,因爲我不知道此代碼的哪一部分導致該問題。 – splingmer

回答

1

已解決。

事實證明,寫入XML的內容確實發生了變化。一個小的,很少實例化的對象在沒有進一步指定類型的情況下將成員聲明爲「Point」,並且編譯器默認使用System.Windows.Point。當我開始引用System.Drawing時,該屬性默默改變,所以它使用Drawing.Point。 (我不知道爲什麼編譯器沒有開始抱怨這是一個模糊的類型名稱。)

無論如何,當序列化程序試圖寫入類型爲Drawing.Point的屬性後,已經寫入了Windows類型的屬性。點,它實現了名稱衝突,並例外。

解決方法是明確地將兩個屬性都鍵入同一個事物。