对不同节点列表的C#对象进行多态XML序列化/去序列化

本文关键字:序列化 多态 XML 对象 节点 列表 | 更新日期: 2023-09-27 18:25:13

我有一个类似的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;
    }
}

对不同节点列表的C#对象进行多态XML序列化/去序列化

afaik您不需要带有类型声明的XmlArrayItem属性,只需将其添加到基类中即可:

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