Полиморфная XML-сериализация / десериализация объектов C # для изменяющегося списка узлов - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть такой XML-файл

<xml>
    <nodes>
        <text/>
        <img/>
        <text/>
    </nodes>
</xml>

Я хочу сопоставить объекты C # с этим, я знаю, как использовать XmlArrayItem, но только в тех случаях, когда в массиве только один тип элементов.Я думал, как это сделать, используя базовый класс для img и текстовых узлов.Но может ли кто-нибудь показать мой код для атрибутов C #, который я могу использовать для автоматической десериализации этого xml в объекты C #.Использование LINQ не требуется.

Вот как я планирую это сделать, но оно не работает:

[Serializable]
[XmlRoot ( "textfile" )]
public class TextFile
{

    [XmlArray ( "nodes" )]
    [XmlArrayItem ( "text", typeof(NodeText)), XmlArrayItem ( "img", typeof(NodeImg) )]
    public List<NodeBase Nodes
    {
        get;
        set;
    }


}

[Serializable]
public class NodeBase
{
}

[Serializable]
public class NodeText : NodeBase
{


[XmlText]
public String CDataContent
{
        get;
        set;
    }
}

[Serializable]
public class NodeImg : NodeBase
{

    [XmlAttribute ( "width" )]
    public Int32 Width
    {
        get;
        set;
    }

    [XmlAttribute ( "height" )]
    public Int32 Height
    {
        get;
        set;
    }

    [XmlAttribute ( "src" )]
    public String SourceImgStr
    {
        get;
        set;
    }
}

1 Ответ

1 голос
/ 21 февраля 2012

На самом деле вам не нужен атрибут XmlArrayItem с объявлениями типов, просто добавьте его в базовый класс:

[Serializable]
[XmlInclude(typeof(NodeText))]
[XmlInclude(typeof(NodeImg))]
public class NodeBase
{}
...