2012-03-05 24 views
2

インデックスがEnumの値にマップされた配列があります。私はこの配列をシリアル化するために、C#のXmlシリアル化ライブラリを使用したいと思います。しかし、私は各XMLノードがそれを表すEnum型の名前を言うことを望みます。これどうやってするの?名前配列内の各要素

例:

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

しかし、私がしたいことは次のとおりです:

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

私は、各番号を保存することはできません

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です個別に - 配列でなければなりません。

ありがとうございました。

+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構造(私が仮定している)の一部であるなら、それはまだ意味があります。

これは単純な例であるため、コードは検証を行いません。したがって、クラスがシリアル化されるときに3つの配列要素がすべて存在することが予想され、3つのXML要素すべてがデシリアライズされたときに存在することが期待されます。 IXmlSerializableインターフェイス上

詳細情報はこちらです:

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

関連する問題