私はXMLにシリアライズしようとしているオブジェクトを持っています。このオブジェクトの中には、ジェネリック型(抽象クラス)のリストがあります。このリストの各項目は、別のクラスかもしれないが、すべては抽象基本クラスから継承されています。私はリストをシリアル化するとき同じ型名のポリモフィックリストをシリアライズ
public abstract class animal
{
public string type { get; set; }
}
public class cat:animal
{
public string size { get; set; }
public string furColor { get; set; }
}
public class fish:animal
{
public string size { get; set; }
public string scaleColor { get; set; }
}
、私はそれは次のようになりたい:
<animal type="cat">
<size>medium</size>
<furColor>black</furColor>
</animal>
<animal type="fish">
<size>small</size>
<scaleColor>silver</scaleColor>
</animal>
I
[XmlElement("Animal")]
public List<animal> Animals { get; set; }
しかし、それはオブジェクトタイプ "cat"を期待していないので、エラーをスローします。 [XmlInclude]タグをベースクラス、派生クラス、またはクラスを含む全体に追加すると、これは役に立ちません。
[XmlElement("Animal", typeof(cat))]
public List<animal> Animals { get; set; }
をし、私がいる限り、私は唯一の猫を使用して、それがしたいので、これは、正常に動作します:
私は、単一のクラスのためのtypeof指定を使用することができます。繰り返しますが、ミックスにフィッシュを追加すると、同じエラー(魚を期待しない)で爆発します。私は複数のtypeof演算を追加することができます
属性:
[XmlElement("Animal")]
[XmlElementAttribute(typeof(cat))]
[XmlElementAttribute(typeof(fish))]
public List<animal> Animals { get; set; }
を、これはコンパイルしますが、要素名を無視し、受け入れられないそれぞれ<cat> </cat>
と<fish> </fish>
、などのオブジェクトをシリアル化します。タイプ「アニマル」を使用
[XmlElement("Animal", typeof(cat))]
[XmlElement("Animal", typeof(fish))]
public List<animal> Animals { get; set; }
この1つは、この時間を別の例外をスローし、両方のオブジェクト「猫」と「魚」ということ:私も、複数の[のXmlElement]タグを追加しようとしました
同じ範囲。
誰もがこのことを考える方法はありますか?
UPDATEはもう少し掘り後、私は、基本クラスに名前空間を追加することを示唆しているThis SO postが見つかりました:これをシリアル化
[XmlRoot(Namespace="myNamespace")]
[XmlInclude(typeof(cat))]
[XmlInclude(typeof(fish))]
public abstract class animal
には、次のものが得られます。
<animal xsi:type="cat" type="cat">
...
</animal>
<animal xsi:type="fish" type="fish">
...
</animal>
XSI: type = "cat"はクラスの名前を参照し、type = "cat"は作成されたtype属性を参照します基底クラス内(上の例を参照)。これはですので、私が必要とするものはに近づいています。私はここで未経験で苦しんでいるかもしれないと恐れていますが、xsi:type属性リストを取り除く方法はありますか?ここで
タイトルを編集しました。 「[質問には「タイトル内に「タグ」を含める必要がありますか」(http://meta.stackexchange.com/questions/19190/)」を参照してください。コンセンサスは「いいえ、そうすべきではありません」です。 –
申し訳ありませんが、私はガイドラインでそのビットを逃しました。ヘッドアップをありがとう。 – JesseF
部分的な解決策が見つかりました。詳細は下部の更新をご覧ください。 – JesseF