用于变化节点列表的多态XML序列化/去序列化到C#对象

时间:2012-02-21 12:26:10

标签: c# xml serialization xml-serialization

我有一个像这样的XML文件

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

我想将C#对象映射到此,我知道如何使用XmlArrayItem但只包含数组中只有一个项类型的地方。我正在考虑如何使用img和text节点的基类来实现它。但是,任何人都可以显示我的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 个答案:

答案 0 :(得分:1)

afaik你不需要带有类型声明的XmlArrayItem属性,只需将它添加到你的基类:

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