ここで複数の質問と回答に出くわしましたが、私の状況に固有のものはありません。
クラス「エンティティ」があり、そこから拡張する複数のクラスがあります。シリアル化してリストにヒットさせ、ノード名の各項目のタイプを理解して使用するようにします。
これで、コメントアウトされたものを使用できます (メイン クラスで各配列項目を定義し、[XmlArrayItem("Subclass1", typeof(subclass1)] を使用してそのような項目の名前を定義します)。サブクラスが多すぎて、メインエンティティクラスのすべてを定義できなくなります...とにかくこれを達成する方法はありますか?
サブクラスなどに [XmlType(TypeName="...")] を使用しようとしましたが、うまくいきませんでした。
[Serializable]
[XmlInclude(typeof(Subclass1))]
[XmlRoot("Entity")]
public class Entity{
[XmlArray("CausedBy")]
//[XmlArrayItem("Subclass1", typeof(subclass1))]
//[XmlArrayItem("Sublcass2", typeof(Subclass2))]
public List<Entity> CausedBy { get; set; }
}
[Serializable]
[XmlRoot("Subclass1")]
[XmlInclude(typeof(Subclass2))]
public class Subclass1:Entity{
//Code...
}
[Serializable]
[XmlRoot("Subclass2")]
public class Subclass2:Subclass1{
//Code...
}
エンティティを作成し、Subclass1 と Subclass2 を「CausedBy」クラスのリストに追加した後に上記のコードをシリアル化すると、次のようになります。
<Entity>
<CausedBy>
<Entity ... xsi:type="SubClass1" />
<Entity ... xsi:type="SubClass2" />
</CausedBy>
<Entity>
出力を表示したい:
<Entity>
<CausedBy>
<SubClass1 .../>
<SubClass2 .../>
</CausedBy>
<Entity>