2012-05-10 75 views
1

使用DCS我想從XML反序列化對象序列化的對象是類型Child繼承類Base其中一些屬性被反序列化但後來被移動到類以代碼爲基礎。現在,這些屬性不會被反序列化:DataContractSerializer對從派生類移動到基類的屬性的反序列化

在這個XML請看:

<Base i:type="a:DirectoryEntry" xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory"> 
    <Active>true</Active> 
    <ContentType>DirectoryEntry</ContentType> 
    <Created>2012-03-12T11:51:25.3401552+01:00</Created> 
    <a:Location>location</a:Location> 
    <a:OpenHours>opening</a:OpenHours> 
</Base> 

的xmlns:a表示派生類型名稱。這堂課用來裝這些道具。現在他們被移入基類,他們不再被DCS反序列化(反序列化後屬性爲空)。我正在談論的屬性與:在他們面前(在這種情況下的位置和OpenHours)。

我們有很多這些文件保存數據。用DCS正確反序列化這些文件有哪些選擇?

請注意[KnownType]屬性上基本都使用與兒童類

回答

0

我的解決方案是將屬性移回原始類,並將它們留在他們首先移動到的類中,現在它給出了Property hides the inherited member...Use the new keyword if hiding was intended的警告,但是我可以忍受這一點,因爲反序列化現在再次運行,我們可以將數據從一個提供者移動到另一個提供者。我無法找到任何其他解決方案,並且對所有序列化數據文件的修改不是一個選項。

0

當你移動的屬性的基類,它們有效地轉移到另一個XML命名空間。基類可能在名稱空間pending.Core.Models處定義,而派生類定義爲pending.Core.Models.Directory(我假設您沒有在[DataContract]屬性的Namespace屬性中指定任何內容,因此如果更改了元素應該在的名稱空間,那麼序列化器將無法與你擁有的數據相匹配。如果移動了最後兩個屬性的基類,你再需要更改的XML元素LocationOpenHours的命名空間。

<Base i:type="a:DirectoryEntry" 
     xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory"> 
    <Active>true</Active> 
    <ContentType>DirectoryEntry</ContentType> 
    <Created>2012-03-12T11:51:25.3401552+01:00</Created> 
    <Location>location</Location> 
    <OpenHours>opening</OpenHours> 
</Base> 
+0

謝謝,這是顯而易見的答案,但需要手動更改XML文件。你知道一個可以讓DCS在Base類中找到這些屬性並將它們序列化的替代方法嗎? – mare

相關問題