2009-06-16 7 views
0

XML Webサービスで(クラスが実装されている)インターフェイスを使用するにはどうすればよいですか?C#xml Webサービスでインターフェイスを使用する

私がそうすると、インターフェイスがシリアル化できないと主張してYSODを取得します。インターフェイスのクラスにSerializable属性を追加すると、進捗を妨げる別のエラーがあります(どちらが覚えられないか)。

+0

他の例外が参考になる場合があります。 –

+0

どのようなタイプのウェブサービスですか? REST、SOAP ...? – vidalsasoon

+0

SOAPでした。私は他の例外メッセージを取得しようとします。 – dotnetdev

答えて

2

ほとんどの場合、インターフェイスは何らかの作業なしでシリアライズ可能ではありません。通常、このエラーは、シリアル化されているクラスに、インタフェースを変数またはその一部として使用しているオブジェクトが含まれている場合に発生します。あなたは常にを継承したオブジェクトにCustomInterfacePropertyを割り当てていることを言わせて、

[Serializable] 
public class TestClass 
{ 
    private ICustomInterface _iCustomInterfaceObject; 

    public ICustomInterface CustomInterfaceProperty 
    { 
     get { return _iCustomInterfaceObject; } 
     set { _iCustomInterfaceObject = value; } 
    } 
} 
議論の便宜上

(と私は追加の検証コードを入力することではない):例えば、このような特性は、エラーをスローしますICustomInterface(このようなインターフェイスタイプを使用する場合に必要です)。たとえそれが常に入力されることが100%確実であっても、TestClassを直列化することはできません。

これを回避するには、エラーをスローしているインターフェイスがISerializableから継承されていることを確認する必要があります。このようにして、ICustomInterfaceから継承したすべてのオブジェクトにもシリアル化メソッドが実装されていることを約束します。

残念ながら、これはxmlシリアル化を使用している場合には当てはまりません。 System.Xml.Serializationにあるシリアライザを使用している場合、このメソッドは機能しません。なぜなら、Robert Harvey氏に指摘するように、インターフェイスにはパラメータのないコンストラクタ(xmlシリアライザを使用する場合に必要)が含まれていないからです。私の提案は、このシリアライゼーションの方法に設定されている場合、そのセクションに属性[XmlIgnore]を添付し、そこで移動してください。

+0

属性[XmlIgnore]を問題のセクションに添付します。この場合、これはインターフェイス全体になります。これは正しいです? – dotnetdev

+0

インターフェイスは通常単なる原因であるため、シリアル化されるプロパティに[XmlIgnore]を適用する必要があります。たとえば、上の例では、 "public ICustomInterface CustomInterfaceProperty"のすぐ上に適用します – Zensar

0

私は、デフォルト(パラメータなし)コンストラクタが含まれていないため、インターフェイスをシリアル化できないというメッセージがあると思います。

基礎となるクラスがフレームワーククラスである場合は、あなたは身体を動かすかもしれません。それらのうちのいくつかは直列化可能とマークされず、それらのうちのいくつかはパラメータのないコンストラクタを持たない。

+0

コンストラクタでパラメータをとるカスタムクラスを使用すると、すべて正常に機能します。これらのクラスは直列化可能とマークされていませんでした。使用されるフレームワーククラスのいくつかは直列化できないかもしれませんが、私は同意します。だから私が使用するすべてのフレームワーククラスは直列化可能でなければならないのですか?しかし、私のビジネスクラスはこの属性を必要としません。 – dotnetdev

+0

私はそれがコンテキストに依存すると思います。私はカスタムクラスを直列化するためにリフレクションを使用するいくつかのヘルパーメソッドを持っていますが、これらのクラスを直列化可能としてマークする必要はありませんでした(ただし、XML名前空間属性でマークされています。フレームワーククラスをシリアライズする際の問題は、他のクラスに依存する(または継承する)ことが多く、フードチェーン全体で動作しなければならないということです。 –

2

私の助言は、基本的なデータ転送オブジェクトとしてワイヤーを越えるオブジェクトを処理することです。ドメインオブジェクトを使用してシリアライズするだけですが、すでに見てきたように、通常のメモリ内オブジェクトは、多くの作業をせずにシリアライズすることができます。

また、ドメインクラスの機能を継承できるように制限することもできます。

最後に、避けるべきより微妙なバグと、別個のDTOを持つ理由は、あなたのドメインオブジェクトを、公に公開されたインターフェース、つまりWebサービス自体に強固に結合しているということです。 Webサービスのバージョニングは面倒な作業になる可能性があり、サービスインターフェイスがドメインクラスと密接に結びついていないと簡単です。

0

また、実行時シリアル化とXMLシリアル化の間で混乱が生じるかもしれません。 XMLシリアライゼーションは、古いASMX Webサービスが使用するものです。 [Serializable]属性にはほとんど注意を払っていませんが、ほとんどの場合、既定のコンストラクターを持つパブリッククラスのpublic読み取り/書き込みプロパティがシリアル化されます。

関連する問題