【问题标题】:Serialize Class to XML issue with XmlRoot Declaration使用 XmlRoot 声明将类序列化为 XML 问题
【发布时间】:2014-01-29 06:58:47
【问题描述】:

我正在将我的课程序列化为 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”,但问题是我已经有了另一个名为 Module 的类。所以为了解决这个问题,我将它称为 WorkflowModule 并像这样放置一个类 XmlRoot() 声明;

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

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

这是我的两门课;

[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 { }

    }

}

}

【问题讨论】:

  • xml文档只能有一个Root
  • 那么在我为 WorkflowModule 类定义 XmlRoot() 的地方有没有办法序列化为另一个名称?

标签: c# .net xml winforms


【解决方案1】:

XmlArrayItem属性中设置元素名称:

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

【讨论】:

    【解决方案2】:

    有很多方法可以控制它,正如这篇重复的帖子How do I Set XmlArrayItem Element name for a List<Custom> implementation?中所定义的那样

    这些属性控件从 this 对象的角度序列化,因为它横穿嵌套对象

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

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

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

    该属性仅在其被序列化的直接对象时才有效

    [XmlRoot("UseThisElementNameWhenItIsTheRoot")]
    public class WorkflowModule
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2017-10-06
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多