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