天天看點

c# 實作xml檔案的序列化和反序列化

目錄

XML檔案用途

先來看一個XML檔案

建構承載xml節點資訊的類

BookStore類

序列化

運作結果

反序列化

運作結果

XML檔案用途

xml問件是衆多檔案類型中的一種。xml最大的功能就是存儲資料,它就像一個純文字的資料庫,可以跨平台、跨系統使用。

XML檔案的序列化就是把對象轉化成可以存儲或傳輸的流狀态。與之相對的反序列化即把流狀态的資料讀入對象中。

XML檔案的結構是樹狀的<></>這樣的一對括号代表了一對節點,<BookStore>bookStore</BookStore>,這樣一對節點就代表了節點名是BookStore,内容是bookStore,

還可以為節點添加id屬性<BookStore id ="1">bookStore</BookStore>

先來看一個XML檔案

<?xml version="1.0" encoding="utf-8"?>
<BookStore>
	<Book>
		<Name>冰與火之歌</Name>
		<Time>2020.12.16</Time>
	</Book>
	<Book>
		<Name>123456</Name>
		<Time>2020.12.16</Time>
	</Book>
  <Book>
    <Name>我個夢想</Name>
    <Time>2020.12.16</Time>
  </Book>
  <Book>
    <Name>我有夢想</Name>
    <Time>2020.12.16</Time>
  </Book>
  <Book>
    <Name>我有一個夢</Name>
    <Time>2020.12.16</Time>
  </Book>
</BookStore>
           

檔案的第一行代表了xml的版本和檔案編碼格

建構承載xml節點資訊的類

根據xml的内容我們需要建構一個BookStore類,它包含了子節點Book類,Book中又有time,name屬性。

BookStore類

public class BookStore
    {
        List<Book> booklist = new List<Book>();
        [XmlElement(ElementName = "Book")]
        public List<Book> Booklist
        {
            get { return booklist; }
            set { booklist = value; }
        }
    }
           

Book類

public class Book
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private string time;

        public string Time
        {
            get { return time; }
            set { time = value; }
        }
        public Book() { }
        public Book(string _name, string _time)
        {
            name = _name;
            time = _time;
        }
    }
           

有了承載資訊的類就可以對xml進行序列化和反序列化了。首先來看序列化。

序列化

public static void xmlSerialize()
        {
            Book book1 = new Book("馬丁路德金", "2020.1.2");
            Book book2 = new Book("冰與火之歌", "2010.1.2");
            Book book3 = new Book("我有一個夢想", "2020.1.2");
            Book book4 = new Book("c#從入門到放棄", "2020.1.2");
            BookStore bookstore = new BookStore();

            bookstore.Booklist.Add(book1);
            bookstore.Booklist.Add(book2);
            bookstore.Booklist.Add(book3);
            bookstore.Booklist.Add(book4);

            StringWriter sw = new StringWriter();
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            XmlSerializer serializer = new XmlSerializer(typeof(BookStore));
            serializer.Serialize(sw, bookstore, ns);
            Console.Write(sw.ToString());
        }
           

運作結果

<?xml version="1.0" encoding="utf-16"?>

<BookStore>

  <Book>

    <Name>馬丁路德金</Name>

    <Time>2020.1.2</Time>

  </Book>

  <Book>

    <Name>冰與火之歌</Name>

    <Time>2010.1.2</Time>

  </Book>

  <Book>

    <Name>我有一個夢想</Name>

    <Time>2020.1.2</Time>

  </Book>

  <Book>

    <Name>c#從入門到放棄</Name>

    <Time>2020.1.2</Time>

  </Book>

</BookStore>請按任意鍵繼續. . .

反序列化

public static void xmlDeserialize()
        {
            //xml來源可能是外部檔案,也可能是從其他系統獲得

            XmlSerializer xmlSearializer = new XmlSerializer(typeof(BookStore));
            
            using(var fs = File.OpenRead(@"D:\ss.xml"))
            {
                       BookStore info = (BookStore)xmlSearializer.Deserialize(fs);
                       foreach (Book per in info.Booklist)
                       {
                           Console.WriteLine("shu:");
                           Console.WriteLine(" 姓名:" + per.Name);
                           Console.WriteLine(" 姓名:" + per.Time);
                       }
            }
        }
           

運作結果

shu:

 姓名:冰與火之歌

 姓名:2020.12.16

shu:

 姓名:123456

 姓名:2020.12.16

shu:

 姓名:我個夢想

 姓名:2020.12.16

shu:

 姓名:我有夢想

 姓名:2020.12.16

shu:

 姓名:我有一個夢

 姓名:2020.12.16

請按任意鍵繼續. . .