2012-03-05 114 views
2

我有一个数组,其索引映射回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> 

我不能存储的每个号码分开 - 它必须是一个数组。

谢谢。

回答

4

您可以实现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

相关问题