C# 序列化和反序列化 詳解

  1. 什麼是序列化以及如何實現序列化?
  2. 如何將對象數據寫入 XML 文件?
  3. 如何從 XML 文件讀取對象數據?

 

什麼是序列化以及如何實現序列化?

序列化是經過將對象轉換爲字節流,從而存儲對象或將對象傳輸到內存,數據庫或文件的過程。主要用途是保存對象的狀態,包括對象的數據,以便可以在須要是重建對象。反向過程稱爲 反序列化。數據庫

 

如上圖所示,對象 object 被序列化爲 流,其中不只包含數據、還包含對象類型的相關信息,如版本、區域性和程序集名稱。而後能夠將此流中的內容存儲到數據庫、文件或內存中。安全

 

序列化的用途:

經過序列化,能夠執行以下操做:經過 Web 服務將對象發送到遠程應用程序、在域之間傳遞對象、以 XML 字符串的形式傳遞對象經過防火牆、跨應用程序維護安全性或用戶專屬信息。網絡

 

讓對象可序列化:

須要具備對象、包含已序列化對象的一個流,以及一個 Fromatter。socket

System.Runtime.Serialization 包含序列化和反序列化對象所必須的類。性能

將 SerializableAttribute 特性應用於某個類型,以表示此類型的實例能夠被序列化,若是對沒有 SerializableAttribute 特性的類型進行序列化,則會引起異常。編碼

若是想讓類中的某個字段不可序列化,可使用 NonSerializedAttribute 特性。spa

 

序列化的三種類型--二進制、XML、JSON

可使用二進制 binary 或 XML 進行序列化,在 二進制序列化中,全部內容都會被序列化,且性能也很好,使用二進制編碼來生成精簡的序列化,能夠用於基於存儲或socket的網絡流。code

XML 序列化可提升可讀性,以及對象共享和使用的靈活性,XML 序列化將對象的公共字段和屬性或方法的參數和返回值序列化成符合特定 XML 格式的流,xml

System.Xml.Serialization 包含序列化和反序列化 XML 所須要的類對象

 

如何將對象數據寫入 XML 文件?

使用 XmlSerializer 類將 overview 對象序列化並寫入 XML 文件

public class XMLWrite  
{  
  
   static void Main(string[] args)  
    {  
        WriteXML();  
    }  
  
    public class Book  
    {  
        public String title;   
    }  
  
    public static void WriteXML()  
    {  
        Book overview = new Book();  
        overview.title = "Serialization Overview";  
        System.Xml.Serialization.XmlSerializer writer =   
            new System.Xml.Serialization.XmlSerializer(typeof(Book));  
  
        var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml";  
        System.IO.FileStream file = System.IO.File.Create(path);  
  
        writer.Serialize(file, overview);  
        file.Close();  
    }  
}

運行結果:

在當前系統的 Documents 文件夾下生成文件 SerializationOverview.xml

內容以下圖:

 

指定 XML 標籤的名字

[XmlRoot(department)]
public
class Department { public string DeptName { get; set; } [XmlElement("extra")] public DeptExtraInfo DeptExtraInfo { get; set; } }

經過在 XmlRoot、XmlElement 後面加上一個括號便可實現,其中XmlRoot用於指定「根」,也就是XML的最上一層的Tag

 

指定 XML 標籤的屬性

[XmlRoot("department")]
public class Department {
    public string DeptName { get; set; } = "研發部";

    [XmlAttribute("timestamp")]
    public int Timestamp = 10;
}

Timestamp就成爲了department這個根節點的timestamp屬性。

 

去掉不須要的 namespace

默認狀況下,xml 的頭部會帶上相似 xmlns:xsd、xmlns:xsi 的屬性,不須要的化能夠經過修改序列化方法實現:

    public static void WriteXML()  
    {  
        Book overview = new Book();  
        overview.title = "Serialization Overview";  
        System.Xml.Serialization.XmlSerializer writer =   
            new System.Xml.Serialization.XmlSerializer(typeof(Book));  
      XmlSerilizerNamespaces ns = new XmlSerializerNamespace();
        var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml";  
        System.IO.FileStream file = System.IO.File.Create(path);  
  
        writer.Serialize(file, overview, ns);  
        file.Close();  
    }  

 

 

 

如何從 XML 文件讀取對象數據?

使用 XmlSerializer 類讀取以前寫入 XML 文件的對象數據

public class Book  
{  
    public String title;  
}         
  
public void ReadXML()  
{  
    // First write something so that there is something to read ...  
    var b = new Book { title = "Serialization Overview" };  
    var writer = new System.Xml.Serialization.XmlSerializer(typeof(Book));  
    var wfile = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml");  
    writer.Serialize(wfile, b);  
    wfile.Close();  
  
    // Now we can read the serialized book ...  
    System.Xml.Serialization.XmlSerializer reader =   
        new System.Xml.Serialization.XmlSerializer(typeof(Book));  
    System.IO.StreamReader file = new System.IO.StreamReader(  
        @"c:\temp\SerializationOverview.xml");  
    Book overview =  (Book)reader.Deserialize(file);  
    file.Close();  
  
    Console.WriteLine(overview.title);  
  
}
相關文章
相關標籤/搜索