2010-11-26 50 views
2

我有一個C#結構的類,其中包含一個抽象基類和從此抽象類派生的各種類。在派生類中使用C#xmlserializer,同時控制生成的XML元素

[System.Xml.Serialization.XmlInclude(typeof(B))] 
public abstract class A { 
... 
} 

[Serializable] 
[XmlType("typename")] 
public class B : A { 
... 
} 

此外,我使用的是B類的實例中的另一C類爲像這樣與它的抽象類型的字段:

public class C { 
    ... 
    public A myItem { get; set; } //A is actually of type B 
    ... 
} 

現在,當我通過標準序列化我的C級XmlSerializer的,我得到一個XML結構是這樣的:

<C> 
    <myItem p2:type="typename" xmlns:p2="..."> 
    ... //Fields as elements and stuff 
    </myItem> 
</C> 

但那不是我所需要的,因爲我把那些序列化C對象的REST web服務(沒有有效的模式還)。我真正需要的是這樣的:

<C> 
    <typename> 
    ... //Fields as elements and stuff 
    </typename> 
</C> 

但是,正如你可以在上面看到,XmlSerializer的似乎在通過XmlType將設置類型名稱偏愛實例字段名。另外,很顯然,我不能僅僅在C中使用XmlElement(「typename」),因爲我不知道該字段將包含的抽象類的具體實現。

有沒有人有過類似的問題,並可以爲我提供解決方案?或者我是否真的需要在我的類A中實現IXmlSerializable,並因此在所有具體的A派生類中實現這個工作?

編輯:剛剛發現,當閱讀一些文章,IXmlSerializable不讓我控制包裝元素,所以我實際上需要實現接口在類C與某種switch()的類型myItem成員?

感謝您的幫助!

最好的問候, FLO

回答

3

好吧,看來我已經找到了解決辦法,至少系列化,還不知道這是否也適用於反序列化。最關鍵的是對的XMLElement屬性,允許指定要使用的密鑰一個特殊的構造,如果使用了抽象類型:

http://msdn.microsoft.com/en-us/library/cz6bdh5z.aspx

也許這也有利於他人。

最佳, FLO

0

反序列化,你將需要提供XmlSerializer的一切,它可能在所有的抽象類型屬性遇到的類型。

XmlSerializer有一個特定的構造函數,您可以在其中爲其提供一組類型。

+0

謝謝,但我實際上認爲已經通過指定XmlInclude屬性來完成......但它似乎完全沒有這個工作...以我需要在類C中存儲特定於類B的信息的價格。 ..但我認爲這是我不得不爲這些東西使用有效模式而付出的代價... – flo 2010-11-26 13:05:13