2011-11-21 11 views
13

XmlSerializerを使用してサービスと通信しています。これは通常のSOAPサービスではなく、独自のXMLオブジェクト型を持ちます。たとえば、<Capabilities>オブジェクトを要求することがありますが、<Exception>を返すことがあります。したがって、言い換えれば、ランダムなXMLドキュメントタイプに対処する必要があります。しかし、私はどのタイプを扱わなければならないかを知っています。XmlSerializerでランダム/未知の型を逆シリアル化します。

私がしようとしているのは、これらのドキュメントをシリアライズ/デシリアライズする一般的なアプローチを見つけることです。問題は、XmlSerializerが作成段階で型を知る必要があることです。を使用して手動で

[XmlInclude(typeof(Exception))] 
[XmlInclude(typeof(Capabilities))] 
public abstract class BaseClass 
{ 
    public BaseClass() 
    { 
    SchemaLocation = "test"; 
    } 

    [XmlAttribute("schemaLocation")] 
    public String SchemaLocation { get; set; } 
} 

[XmlRoot("Exception")] 
public class Exception : BaseClass 
{ 
    public Exception():base() 
    { 
    } 
    [XmlElement] 
    public String Message { set; get; } 
} 

[XmlRoot("Capabilities")] 
public class Capabilities : BaseClass 
{ 
    public Capabilities() : base() 
    {} 
    [XmlElement] 
    public String ServiceName { set; get; } 
} 

私のソリューションは、これまでのルート要素を調査することです:

これら

ができるように、基本クラスを作成し、この場合には動作しません [XmlInclude]属性を使用して、共通のルート要素にカプセル化されませんXmlReaderを開き、XmlSerializerインスタンスを作成する前に正しい型にマップします。

これを実行する方法はありますか?

+0

あなたの方法は大丈夫だと思います。あなたが記述しているようなモデルでは、XmlSerializerはうまく動作しません。これをもっと一般的にするにはいくつかのトリックがありますが、ルート要素にカプセル化された 'BaseClass'に依存します。このルート要素をxmlの周りに追加し、このメソッドを適用するか、XmlIncludeを使用することができます。 http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal

答えて

1

ご要望の際にお伝えしたとおり、サービスが返される場合があります。それで、あるタイプのリクエストがあった場合、そのサービスは特定のタイプだけを返すかもしれませんか?

XmlSerializer Constructor (Type, Type[]) 指定された型のオブジェクトをXMLドキュメントにシリアル化し、XMLドキュメントを指定された型のオブジェクトに逆シリアル化できるXmlSerializerクラスの新しいインスタンスを初期化します。プロパティまたはフィールドが配列を返す場合、extraTypesパラメーターは配列に挿入できるオブジェクトを指定します。

+1

を参照してください。正しく、私は特定のタイプ、その3-4 differnetタイプを賞賛することができます。 私は(Type、Type [])で運がないコンストラクタを試しました。実際にはXmlIncludeAttributeを使うのと同じです。 – Oyvind