2013-12-18 47 views
1

問題:我有一些序列化類這樣的:如何序列化類成員,以XML基於其類型

public abstract class Person {} 
public class Student : Person {} 
public class Teacher : Person {} 

[Serializable()] 
[XmlIncludeAttribute(typeof(Student))] 
[XmlIncludeAttribute(typeof(Teacher))] 
public class Room 
{ 
    [XmlElementAttribute(??)] 
    public Person[] persons; 
} 

假設我有一個對象是這樣的:

Room r = new Room(); 
r.persons= new Person[]{new Student(), new Teacher()}; 

我的結果:當我序列化它時,它會是這樣的:

<Room> 
    <Person /> 
    <Person /> 
</Room> 

我需要:我需要的是這樣的,但我不知道

<Room> 
    <Student/> 
    <Teacher/> 
</Room> 

任何幫助嗎?

回答

1

有幾種方法可以做到這一點,這裏有他們兩個:

  1. Room必須實現接口「IXmlSerializable的」。這將允許您使序列化更靈活(How to Implement IXmlSerializable Correctly)。
  2. 或者您可以使用XmlAttributeOverrides來覆蓋序列化。 (Custom XML-element name for base class field in serialization
+0

謝謝。我在你的鏈接中找到了這個想法。 '公共教室 { [的XmlElement( 「學生」 的typeof(學生))] [的XmlElement( 「老師」 的typeof(教師))] 公開名單人員{獲得;組; } }' –

1

這裏是解決方案,但有一個更多的中間層。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleApplication8 { 
    class Program { 
     static void Main(string[] args) { 
      Room r = new Room(); 
      r.Persons = new List<Person>(); 
      r.Persons.Add(new Student() { StudentID = "001" }); 
      r.Persons.Add(new Teacher() { Name = "James" }); 

      var serializer = new XmlSerializer(typeof(Room)); 
      serializer.Serialize(Console.Out, r); 

      Console.Read(); 
     } 
    } 

    public class Person { } 

    public class Student : Person { 
     public String StudentID { get; set; } 
    } 

    public class Teacher : Person { 
     public String Name { get; set; } 
    } 

    public class Room { 
     [XmlArrayItem(typeof(Student)), 
     XmlArrayItem(typeof(Teacher))] 
     public List<Person> Persons { get; set; } 
    } 
} 
+0

謝謝,我之前嘗試過,輸出效果很好。但有一個額外的''元素。這正是我需要的: 詹姆斯

相關問題