XML序列化和反序列化

在談XML序列化以前,咱們先來講說序列化。java


序列化名詞解釋:序列化是將對象狀態轉換爲可保持或傳輸的格式的過程。網絡


與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,能夠輕鬆地存儲和傳輸數據。這就是序列化的意義所在。函數

咱們能夠把對象序列化爲不一樣的格式,好比說,Json序列化、XML序列化、二進制序列化、SOAP序列化等,以上這些不一樣的格式也都是爲了適應具體的業務需求。this

在本篇文章中,咱們就來分析一下XML的序列化和反序列化。咱們先來看一個XML文件:spa

<?xml version="1.0" encoding="utf-8" ?>
<BaseInfo>
  <Person>
    <Name>小明</Name>
    <Age>16</Age>
    <Books>
      <Book>
        <ISBN>123</ISBN>
        <Title>借的書1</Title>
      </Book>
    </Books>
  </Person>
  <Person>
    <Name>小紅</Name>
    <Age>18</Age>
    <Books>
      <Book>
        <ISBN>456</ISBN>
        <Title>借的書2</Title>
      </Book>
      <Book>
        <ISBN>789</ISBN>
        <Title>借的書3</Title>
      </Book>
    </Books>
  </Person>
</BaseInfo>

在這個文件中BaseInfo爲該XML的跟節點,它的裏面由多個Person節點組成,在Person節點中又包括Name、Age、Books節點,Books節點中又由多個Book組成,在Book中又包括ISBN和Title。code


下面首先咱們要作的是建立與該XML相對應的對象,而後把對象轉換爲上述XML(序列化),或者把上述XML轉換爲對象(反序列化)。下面的例子中只是把XML存到本地,再從本地讀取出來,若是須要在網絡中傳輸,應該添加Serializable屬性,咱們先來建立對象。xml

using System.Xml.Serialization;
public class BaseInfo
{
   List<Person> perList = new List<Person>();
 
   [XmlElement(ElementName="Person")]
    public List<Person> PerList
    {
       get { return perList; }
       set { perList = value; }
    }
}

使用XML序列化須要引入命名空間System.Xml.Serialization。咱們建立的類名稱爲BaseInfo,這裏與XML的跟節點須要對應,固然咱們也能夠指定該類轉換爲XML時映射成的名稱,這裏可使用XmlRoot中的ElementName來指定它的名稱,就像該類中的屬性PerList那樣應用,固然你也可使用比較省事的方法,類的名稱和XML節點的名稱相同便可,就像該例子中同樣。在BaseInfo類中,咱們維護了一個PerList它是一個Person對象的集合,固然這個屬性的名稱並不與XML文件中的對應,因此要更改它的名稱爲Person。對象


好,接下來咱們看看Person類:blog

using System.Xml.Serialization;
public class Person
{
     string name;
     int age;
     List<Books> bookList=new List<Books>();
 
     /// <summary>
     /// 必須有默認的構造函數
     /// </summary>
     public Person()
     { }
 
     public Person(string name, int age)
     {
         this.name = name;
         this.age = age;
     }
 
     public string Name
     {
         get { return name; }
         set { name = value; }
     }
 
     public int Age
     {
         get { return age; }
         set { age = value; }
     }
 
     [XmlElement(ElementName = "Books")]
     public List<Books> BookList
     {
         get { return bookList; }
         set { bookList = value; }
     }
 }

在該類中有Name和Age,還有維護了一個Books對象。utf-8


咱們再來看看Books:

using System.Xml.Serialization;
public class Books
{
    List<Book> bookList = new List<Book>();
 
    [XmlElement(ElementName = "Book")]
    public List<Book> BookList
    {
        get { return bookList; }
        set { bookList = value; }
    }
}

Books的做用就像是一個過渡的類,只爲了與XML中的節點Books對應,在該類中維護了Book類的對象集合。


那麼,最後咱們來看Book類:

using System.Xml.Serialization;
public class Book
{
    string isbn;
    string title;
 
    public Book() { }
 
    public Book(string isbn, string title)
    {
        this.isbn = isbn;
        this.title = title;
    }
 
    public string ISBN
    {
        get { return isbn; }
        set { isbn = value; }
    }
  
    public string Title
    {
        get { return title; }
        set { title = value; }
    }   
}

好了,這樣咱們須要的類也就都建立完了,雖然說建立類的過程有些繁雜,可是有了這些類,咱們也就不用一個一個處理XML的節點了。咱們建立一個簡單的控制檯程序,在裏面添加兩個處理方法,第一個是序列化方法:

public static void xmlSerialize()
{
    Book b1 = new Book("111","書1");
    Book b2 = new Book("222","書2");
    Book b3 = new Book("333","書3");
    Books bs1 = new Books();
    Books bs2 = new Books();
    bs1.BookList.Add(b1);
    bs1.BookList.Add(b2);
    bs2.BookList.Add(b3);
    Person p1 = new Person("張三", 11);
    Person p2 = new Person("李四", 22);
    p1.BookList.Add(bs1);
    p2.BookList.Add(bs2);
    BaseInfo baseInfo = new BaseInfo();
    baseInfo.PerList.Add(p1);
    baseInfo.PerList.Add(p2);
 
    StringWriter sw = new StringWriter();
    //建立XML命名空間
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("","");
    XmlSerializer serializer = new XmlSerializer(typeof(BaseInfo));
    serializer.Serialize(sw, baseInfo, ns);
    sw.Close();
 
    Console.Write(sw.ToString());
}

調用該方法運行效果:

1


第二個是反序列化方法:

public static void xmlDeserialize()
{
    //xml來源多是外部文件,也多是從其餘系統得到
    FileStream file = new FileStream(@"http://www.cnblogs.com/info.xml", FileMode.Open, FileAccess.Read);
    XmlSerializer xmlSearializer = new XmlSerializer(typeof(BaseInfo));
    BaseInfo info = (BaseInfo)xmlSearializer.Deserialize(file);
    file.Close();
    foreach (Person per in info.PerList)
    {
        Console.WriteLine("人員:");
        Console.WriteLine(" 姓名:" + per.Name);
        Console.WriteLine(" 年齡:" + per.Age);
        foreach (Books b1 in per.BookList)
        {
            foreach (Book b in b1.BookList)
            {
                Console.WriteLine(" 書:");
                Console.WriteLine("     ISBN:" + b.ISBN);
                Console.WriteLine("     書名:" + b.Title);
            }
        }
    }
}

 

調用該方法運行效果:

2

相關文章
相關標籤/搜索