2009-08-11 23 views
9

我有一個抽象類。我們稱之爲Lifeform。它看起來是這樣的:ASMX Web服務不能序列化抽象基類

public abstract class Lifeform { 
    public virtual int Legs { get; set; } 
    public virtual int Arms { get; set; } 
    public virtual bool Alive { get; set; } 
} 

(virtual屬性是由於這樣的事實,我使用NHibernate的,如果他們不虛擬特性,這哼唧。)

我那麼有哪些繼承的類來自Lifeform課堂;我們將它稱爲人類。它看起來是這樣的:

public class Human: Lifeform { 
    public virtual bool Hat { get; set; } 
    public virtual int Age { get; set; } 
    public virtual string Name { get; set; } 
} 

一切的可愛,我可以用我的班,人類當我使用它得到的腿,胳膊,和活體特性。除此之外,當我嘗試使用Human類創建Web服務時。序列化的對象給了我帽子,年齡和名字 - 但沒有腿,胳膊或者活着的屬性。

我見過的建議使用

[System.Xml.Serialization.XmlInclude(typeof(Human))] 

基類(生命形式)一種解決方法,但是,似乎是違反OO一個可怕的黑客。將基類上的鏈接放到繼承它的類上?好惡。

有沒有人遇到過這個特定問題?有什麼想法?如果更深入的例子能夠幫助描述我正在做的更多,我會提供更多的代碼。

+0

我有同樣的問題,這幫助我解決它。不過,我最終設置了類的屬性,而不是返回它的方法。 – Guffa 2009-10-19 19:06:59

回答

8

從我讀過的內容中,可以在返回對象的web方法中包含XMLInclude屬性,而不是在基類中。仍然不漂亮,但可能會吸引你比在基類中放置派生類名稱更多一點。我沒有嘗試過,但我認爲你可以做這樣的事情。

[WebMethod] 
[XmlInclude(typeof(LifeForm))] 
public Human GetHuman() 
{ 
    return new Human(); 
} 
+0

太棒了,謝謝。起初它不起作用 - 但似乎產生了正確的代碼,它只是不顯示在示例中。我一直在嘗試它,它似乎沒有工作,直到我想到「到底是什麼」並實際生成序列化對象。美麗。不完美,但是,嘿,這比衝擊我的基礎班要好得多。謝謝! – 2009-08-11 19:53:26

+0

如果您想將基類作爲參數傳遞給GetHuman函數並將其轉換爲Human,那麼該如何處理?可能? – 2011-06-06 21:32:51

+0

我將如何去列出許多類型? – Stainedart 2011-11-21 21:30:18

0

進入與VB.NET完全相同的問題。使用XMLInclude屬性,雖然醜陋,但伎倆。

+0

VB.NET出現同樣的問題並不奇怪,因爲它是一個.NET問題,而不是C#問題。 – 2009-08-11 21:47:41