2012-03-05 3 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> 

Я не могу хранить каждый номер отдельно - это должен быть массив.

Спасибо.

+0

Слишком плохо ваше перечисление не [доктор, юрист, лютеранский] (http://www.last.fm/music/John% 20Williams/_/Doctor,% 20Lawyer,% 20Lutheran) :-) – svick

ответ

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

Смежные вопросы