使用XmlRoot声明将类序列化为XML问题

时间:2014-01-29 06:58:48

标签: c# .net xml winforms

我将我的类序列化为XML。我有一个问题,我的一个类的根元素没有正确命名。

完整的XML结构应如下所示。

<Workflow>
  <Name>My Workflow</Name>
  <Description />
  <Modules>
    <Module Name="Intro" MenuText="IntroText" />
  </Modules>
</Workflow>

但是我得到了这个结果

<Workflow>
  <Name>My Workflow</Name>
  <Description />
  <Modules>
    <WorkflowModule Name="Intro" MenuText="IntroText" />
  </Modules>
</Workflow>

我希望元素“WorkflowModule”被称为“模块”,但问题是我已经有了另一个名为Module的类。因此,为了解决这个问题,我将其称为WorkflowModule,并将类XmlRoot()声明为这样;

[XmlRoot("Module")]
public class WorkflowModule
{...}

但是当我序列化Workflow类时,它仍然会出现WorkflowModule。

这是我的2班课程;

[XmlRoot("Workflow")]
public class Workflow
{

    private string _name;
    private string _description;
    private List<WorkflowModule> _modules = new List<WorkflowModule>();



    [XmlElement("Name")]
    public String Name
    {
        get {  }
        set {  }
    }


    [XmlElement("Description")]
    public String Description
    {
        get {  }
        set {  }
    }


    [XmlArrayItem(typeof(WorkflowModule))]
    public List<WorkflowModule> Modules
    {
        get { }
        set { }
    }
}








[XmlRoot("Module")]
public class WorkflowModule
{

    private string _name;
    private string _menu_text;


    public WorkflowModule()
    {
    }


    [XmlAttribute("Name")]
    public String Name
    {
        get { }
        set { }

    }


    [XmlAttribute("MenuText")]
    public String MenuText
    {
        get { }
        set { }

    }

}

}

2 个答案:

答案 0 :(得分:2)

XmlArrayItem属性中设置元素名称:

[XmlArrayItem(typeof(WorkflowModule), ElementName = "Module")]

答案 1 :(得分:1)

根据此重复帖How do I Set XmlArrayItem Element name for a List<Custom> implementation?

中的定义,有很多方法可以控制它

这些属性控件在此对象的透视图中进行序列化,因为它横穿嵌套对象

[XmlArray("RootArrayElementNameGoesHere")]
[XmlArrayItem(typeof(Workflow), ElementName="ArrayItemElementNameGoesHere")]
public List<WorkflowModule> Modules

此属性重新定义元素名称,但可以使用本地[XmlArrayItem]或[XmlElement]属性覆盖,以提供来自拥有对象序列化的本地覆盖

[XmlType(TypeName = "UseThisElementNameInsteadOfClassName")]
public class WorkflowModule

此属性仅在其序列化的直接对象

时受到尊重
[XmlRoot("UseThisElementNameWhenItIsTheRoot")]
public class WorkflowModule