0

このようなコレクションのxmlファイルがあります

<AbstractCollection>
    <ConcreteA name="Bob" age="4"/>
    <ConcreteB name="Tree" size="1" />
</AbstractCollection>

具体的なコレクションを使用する場合(つまり、2つの要素が同じタイプである場合)、C#で標準のXML逆シリアル化を使用するのは簡単です。タイプが異なると、それがより難しくなるようです。

これを取り除くために単純なxml逆シリアル化を使用する方法はありますか、それとも自分で逆シリアル化を実装する必要がありますか?

[わかりやすくするために追加]xmlは既に存在し、変更できないことを追加する必要があります。上記のような形式のメッセージをxmlで受信しています。より具体的な例は次のとおりです。

<Actions>
    <Walked name="Bob" distance="4"/>
    <Cycled name="Jane" gear="3rd" />
</Actions>

最終的には、「Cycled」オブジェクトと「Walked」オブジェクトになります。ああ、そしてそれをさらに楽しくするために、順序は重要です。

また、コードでXmlInclude属性を使用しようとしましたが、シリアル化するときにxmlを変更することで機能します(もちろん間違って使用していない限り)。

4

1 に答える 1

1

だから私はこの答えのおかげで解決策を見つけました。

重要なのはXmlElementAttribute、さまざまなクラスのシリアル化方法を変更するために使用することでした。

唯一の奇妙な部分は、リストのラッパークラスを作成する必要があることです。そうしないと、Cycled要素とWalked要素がルート要素にラップされません。

名前空間のものがまだそこにあることは知っていますが、それに対処することができます-派生クラスを取得する問題は解決されました!

チップインしてくれたみんなに感謝します。

[Serializable]
public class Actions
{
    [XmlElementAttribute("Walked", typeof(WalkedAction))]
    [XmlElementAttribute("Cycled", typeof(CycledAction))]
    public List<Action> ActionList { get; set; }
}
[Serializable]
public abstract class Action
{
    [XmlAttribute]
    public string Name { get; set; }
}

[Serializable]
public class WalkedAction : Action
{
    [XmlAttribute]
    public int Distance { get; set; }
}

[Serializable]
public class CycledAction : Action
{
    [XmlAttribute]
    public string Gear { get; set; }
}


public class Program
{
    public static void Main(string[] args)
    {
        var actionList = new Actions();
        actionList.ActionList = new List<Action>();
        actionList.ActionList.Add(new WalkedAction { Name = "Bob", Distance = 4 });
        actionList.ActionList.Add(new CycledAction { Name = "Jane", Gear = "3rd" });

        var ser = new XmlSerializer(typeof(Actions));

        TextWriter w = new StringWriter();
        ser.Serialize(w, actionList);

        TextReader r = new StringReader(w.ToString());
        Actions result = (Actions) ser.Deserialize(r);
    }
}
于 2013-03-26T11:51:31.170 に答える