2009-06-12 93 views
1

我正在使用抽象類作爲Web服務調用中的參數。目前,我包括派生類的基類的XmlInclude,就像這樣:Web服務 - 派生類中的XmlInclude而不是基類?

[XmlInclude(typeof(DerivedClass))] 
public abstract class BaseClass 
{ 
} 

不過,我寧願不包括所有的基類派生類型。

http://www.pluralsight.com/community/blogs/craig/archive/2004/07/08/1580.aspx,作者提到一個選擇 - 寫上面的Web方法的屬性,而不是像這樣:

[WebMethod] 
[System.Xml.Serialization.XmlInclude(typeof(DerivedClass))] 
public BaseClass getClass() { 
    return new DerivedClass(); 
} 

不過,我也想不把派生類型的Web服務或者。有沒有在派生類型中保留屬性的方法?

回答

4

讓我們假設框架在某種程度上需要知道發生反序列化時類型是什麼類型,以及這些類型是如何用xml表示的。如果存儲在派生類型中,則無法推斷此信息。

然後,您有幾個選項: - 使用XmlInclude屬性 - 指定XmlSerializer的構造函數設定允許的類型重載

現在,如果你希望一個子類中被傳遞到web服務,web服務器控制序列化和反序列化。所以XmlSerializer contstructor不再是一個選項。

如您所說,您可以將屬性放在webservice方法上,而不是直接放在類上。在保持你的課程「純粹」並記住將這些屬性放在他們可能需要的每個地方之間有一個折衷。

當然,真正的問題似乎是,您試圖將您的業務對象用作Web服務層中的消息格式。

如果您確實希望將「消息格式」和「業務對象」責任分開,則需要另一個類(具有完整層次結構),僅將其用作web服務參數。在這種情況下,在基類中粘貼所需的所有XmlInclude屬性沒有問題。然後,在調用Web服務時,使業務對象適應消息格式對象。這爲您提供了不將webservice類型約束應用於參數類型(例如,沒有接口作爲參數)的附加好處。

當然,這種方法並不方便。最後,webservice需要知道期望的類型,否則將無法正確地序列化和反序列化它們。

是的,這是一個漫長的解釋,爲什麼答案是否定的,你不能只保留派生類型的屬性。我很想錯,雖然:)

2

我不明白在這種情況下。如果您正在反序列化,那麼在指定派生類型中指定額外類型數組的地方會有重載。