【问题标题】:Name Each Element in Array命名数组中的每个元素
【发布时间】:2012-03-05 22:08:00
【问题描述】:

我有一个数组,其索引映射回Enum 值。我想使用 C# Xml 序列化库来序列化这个数组。但是,我希望每个 Xml 节点都说出它所代表的 Enum 类型的名称。我该怎么做?

例子:

public class NumberOfEmployees
{
   public enum EmployeeType { Lawyer, Doctor, Engineer };

   public int[] NumEmployees { get; set; }

   // Constructor initializes array to size of "EmployeeType"
   public NumberOfEmployees()
   {
      int size = Enum.GetValues(typeof(EmployeeType)).Length;
      this.NumEmployees = new int[size];
   }    
}


Main()
{
   NumberOfEmployees numEmployees = new NumberOfEmployees();
   // Add doctors, lawyers, engineers, etc...
   // numEmployees.NumEmployees[(int)NumberOfEmployees.Lawyer] = 3;
   // numEmployees.NumEmployees[(int)NumberOfEmployees.Doctor] = 2;
   // numEmployees.NumEmployees[(int)NumberOfEmployees.Engineer] = 1;

   // Serialize to "file"
   FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
   XmlSerializer xml = new XmlSerializer(typeof(NumberOfEmployees));   
   xml.Serialize(fs, numEmployees);
   fs.Close();
}

最终结果是看起来像这样的 xml:

<NumEmployees>
  <int>3</int>
  <int>2</int>
  <int>1</int>
</NumEmployees>

但我想要的是:

<NumEmployees>
  <Lawyer>3</Lawyer>
  <Doctor>2</Doctor>
  <Engineer>1</Engineer>
</NumEmployees>

我不能单独存储每个数字——它必须是一个数组。

谢谢。

【问题讨论】:

标签: c# xml serialization xml-serialization


【解决方案1】:

您可以实现 IXmlSerializable 接口以使用 XmlSerializer 完全自定义序列化。类似于以下内容:

public class NumberOfEmployees : IXmlSerializable
{
    public int[] NumEmployees { get; set; }

    // Constructor initializes array to size of "EmployeeType"
    public NumberOfEmployees()
    {
        int size = Enum.GetValues(typeof(EmployeeType)).Length;
        this.NumEmployees = new int[size];
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.ReadStartElement();
        NumEmployees[(int)EmployeeType.Lawyer] = int.Parse(reader.ReadElementString("Lawyer"));
        NumEmployees[(int)EmployeeType.Doctor] = int.Parse(reader.ReadElementString("Doctor"));
        NumEmployees[(int)EmployeeType.Engineer] = int.Parse(reader.ReadElementString("Engineer"));
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString("Lawyer", NumEmployees[(int)EmployeeType.Lawyer].ToString());
        writer.WriteElementString("Doctor", NumEmployees[(int)EmployeeType.Doctor].ToString());
        writer.WriteElementString("Engineer", NumEmployees[(int)EmployeeType.Engineer].ToString());
    }
}

在您完成所有这些之后,仍然使用XmlSerializer 似乎毫无意义,因为您的班级正在处理所有序列化工作。但是,如果NumberOfEmployees 是更大的 XML 结构的一部分(我假设是),它仍然有意义。

还要注意代码不做任何验证,因为这是一个简单的例子。因此,当类被序列化时,所有三个数组元素都应该存在,而当它被反序列化时,所有三个 XML 元素都应该存在。

有关IXmlSerializable 界面的更多信息,请点击此处:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多