簡體   English   中英

在 C# xml web 服務中使用接口

[英]Using an interface in a C# xml web service

如何在 XML web 服務中使用接口(從哪些類實現)?

當我這樣做時,我得到一個 YSOD 聲明接口不可序列化。 如果我將 Serializable 屬性添加到接口的 class,則會出現另一個阻礙進度的錯誤(不記得是哪個)。

大多數情況下,如果不做一些工作,接口是不可序列化的。 當被序列化的 class 包含一個 object 正在使用接口作為變量,或者它的一些變體時,通常會遇到此錯誤。 例如,這樣的屬性會引發錯誤:

[Serializable]
public class TestClass
{
     private ICustomInterface _iCustomInterfaceObject;

     public ICustomInterface CustomInterfaceProperty
     {
         get { return _iCustomInterfaceObject; }
         set { _iCustomInterfaceObject = value; }
     }
}

為了論證(而不是讓我輸入額外的驗證代碼),假設您總是將 CustomInterfaceProperty 分配給繼承自 ICustomInterface 的 object(使用此類接口類型時需要)。 即使它 100% 肯定總是被填充,它也不允許您序列化 TestClass。

要解決這個問題,您需要確保您正在使用的接口(引發錯誤的接口)也繼承自 ISerializable。 這樣您就可以保證從 ICustomInterface 繼承的所有對象也都實現了序列化方法。

不幸的是,使用 xml 序列化時情況並非如此。 如果您使用的是 System.Xml.Serialization 中的序列化程序,那么此方法將不起作用,因為正如 Robert Harvey 指出的那樣,接口不包含無參數構造函數(使用 xml 序列化程序時需要)。 我現在的建議是,如果您設置了這種序列化方法,請將屬性 [XmlIgnore] 附加到有問題的部分,然后從那里繼續。

我的建議是將網絡上的 go 對象視為基本數據傳輸對象,僅此而已。 您很想只使用您的域對象並將它們序列化,但正如您已經看到的那樣,普通的內存中對象的復雜性遠遠超過無需大量工作即可序列化的復雜性,有時甚至根本不需要。

您還可以最終限制域類的功能,只是為了使它們可序列化。

最后,要避免的一個更微妙的錯誤,以及擁有單獨 DTO 的原因是,否則您會將域對象緊密耦合到公開發布的接口,即 web 服務本身。 對 web 服務進行版本控制可能會很麻煩,如果您的服務接口不與您的域類緊密耦合,則更容易。

我猜另一個消息是你不能序列化接口,因為它不包含默認(無參數)構造函數。

如果底層類是框架類,您可能會被淹沒。 其中一些未標記為可序列化,其中一些沒有無參數構造函數。

此外,您可能會對運行時序列化和 XML 序列化感到困惑。 XML 序列化是舊的 ASMX web 服務使用的。 它不太關注 [Serializable] 屬性,但主要只是序列化具有默認構造函數的公共類的公共讀/寫屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM