0

現在、コードを介してユーザー インターフェイスを簡単に定義できる XNA エンジン用の UI フレームワークを作成しています。XML経由でユーザーインターフェースを定義できるようにすることで、使いやすくすることを検討しています。

私が立ち往生しているのは、逆シリアル化クラスの作成です。問題は、ルートにアイテムのコレクションが含まれており、一部のアイテムに 1 つ以上の子アイテムが含まれている可能性があることです。現在、次のようなものがあります。

[XmlRoot]
public class RootClass
{
    [XmlArray]
    [XmlArrayItem("ClassA", typeof(ClassA)]
    [XmlArrayItem("ClassB", typeof(ClassB)]
    public List<BaseClass> Classes { get; set; }
}

public class BaseClass
{
    [XmlAttribute]
    public string Name { get; set;
}

public class ClassA : BaseClass
{
    [XmlAttribute]
    public string AValue { get; set;

    [XmlArray]
    [XmlArrayItem("ClassA", typeof(ClassA)]
    [XmlArrayItem("ClassB", typeof(ClassB)]
    public List<BaseClass> Children { get; set; }
}

public class ClassB : BaseClass
{
    [XmlAttribute]
    public string BValue { get; set;

    [XmlElement("ClassA", typeof(ClassA)]
    [XmlElement("ClassB", typeof(ClassB)]
    public BaseClass SingleChild { get; set; }
}

これの意図は、ルートには任意の数のサブクラスを含めることがClassAできますが、要素には任意の数の子クラスを含めることができ、ClassB型には単一の子クラスを含めることができるということです。

から継承する新しいクラスBaseClass( など) を追加すると、プロパティ使用される他のすべてのリストにClassC新しいXmlArrayItem属性を追加する必要があるため、これには大きな保守性の問題があります。クラスのリストも含まれている場合は、属性リストを維持するために必要な 3 つのポイントです。また、単一のクラス値に新しい属性が追加されていることを確認する必要もあります。RootClass.ClassesClassCXmlArrayItem[XmlElement]

すべてのデシリアライゼーション クラスでこれらの継承マッピングを繰り返さなくても済む簡単な方法はありますか?

4

1 に答える 1

1

別のアプローチは、私が思うIXmlSerializableを実装することです。複雑な継承のシリアル化と逆シリアル化を処理するために、私自身のプロジェクトでこれを行いました。子クラスによって上書きされる ReadXml/WriteXml メソッドを使用して、逆シリアル化を「制御」できます。

プログラムの実行時にロードされる型によってクラスを拡張する場合や、毎回属性を編集したくない場合など、フレームワークに「動的」メカニズムがある場合は、独自に IXmlSerializable を実装する方がはるかに優れています。この方法では、クラスの Type をシリアル化する必要があります。また、逆シリアル化時に、「Activator」とシリアル化した型を介してオブジェクトを作成できます。

于 2013-09-04T03:15:43.110 に答える