2010-06-25 50 views
2

我有這樣的場景:XmlInclude到(反)序列繼承類型在單獨的程序集

namespace MyApp.Animals 
{ 
    public class Dog : MyApp.Categories.Canine 
    ... 

所以我想序列化/反序列化的狗類。不幸的是,我不能使用[XmlInclude]屬性,因爲通過將它添加到父類(MyApp.Categories.Canine),我需要添加對父類存在的程序集的引用(MyApp.Animals)..然而,由於繼承,子類已經引用父類...所以我們有一個循環引用。

是否有任何實現此目的的最佳實踐方式?我可以通過手動序列化/反序列化父類上存在的屬性來解決這個問題,並且只是在子節點上進行序列化,但這不是很優雅。

盼望一些更好的技巧..

UPDATE:添加到例如響應下面約翰的評論...

我沒有一個完整的代碼示例(我用的工作代碼大規模和複雜的),但問題是,應該去/從xml序列化的一些屬性包含在父類中,該父類與子類不同。

將XmlElement屬性添加到父類不起作用,因爲我們實際上正在對子類進行de/serialization,因此它不會迭代到父級。而且我們不能在父對象上做,因爲我們不能添加對孩子的引用(因爲孩子已經在引用父對象),所以de/serialiser將不知道要對哪個孩子進行操作。

要增加複雜性的一個額外的水平,我與實際上被取消/序列化爲更大的序列的一部分,由父對象的下列財產問題的對象:

[XmlElement("ShippingAddress")] 
    public Location ShippingAddress 
    { 
     get { return _shippingAddress; } 
     set { _shippingAddress = value; } 
    } 

的問題在於這裏的位置類型是子位置類型。因此,只有子類型的屬性纔會變爲de/serialized ...父類型(也稱爲Location,但在不同的名稱空間中)中的所有屬性都不是。

這是否使它更清晰?

+0

能否請你告訴代碼和生成的XML?目前還不清楚爲什麼你需要'XmlInclude'。 – 2010-06-25 00:42:44

+0

我已經更新了我原來的帖子.. – Jeeby 2010-06-25 01:42:26

回答

1

XmlSerializer有一個constructor,它接受一個名爲「extraTypes」類型的數組。就像添加了XmlInclude屬性一樣,此數組中的類型將在序列化和反序列化過程中可用。

var serializer = new XmlSerializer(typeof(Canine), new Type[] { typeof(Dog) }); 

更新:這種方法只如果XML包括xsi:type屬性當類型爲從什麼是聲明的根對象上的不同。這聽起來像你可能只是總是將該屬性反序列化爲另一種類型。在這種情況下,您可以使用XmlAttributeOverrides替換原始類型的元數據。構建XmlSerializer的是這樣的:

var overrides = new XmlAttributeOverrides(); 
var xmlAttributes = new XmlAttributes(); 
xmlAttributes.XmlElements.Add(new XmlElementAttribute("ShippingAddress", typeof(ITSM.Location))); 
overrides.Add(typeof(Order), "Location", xmlAttributes); 
var ser = new XmlSerializer(typeof(Order), overrides); 

將與上Order.Location屬性替換的屬性相同的效果:

[XmlElement("ShippingAddress", typeof(ITSM.Location))] 
+0

是啊..我已經試過 - 沒有工作。我認爲,因爲我實際上調用父對象上的反序列化,而不是與我有問題的對象: //將收到的XML反序列化爲Order對象 Type [] types = {typeof(Common。位置),typeof(ITSM.Location)}; Order o =(Order)EntityUtils.DeserializeObject (d.DocumentElement,types); – Jeeby 2010-06-25 06:39:44