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


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

 

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

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

 

如上圖所示,對象 object 被序列化為 流,其中不僅包含數據、還包含對象類型的相關信息,如版本、區域性和程序集名稱。然后可以將此流中的內容存儲到數據庫、文件或內存中。

 

序列化的用途:

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

 

讓對象可序列化:

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

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

將 SerializableAttribute 特性應用於某個類型,以表示此類型的實例可以被序列化,如果對沒有 SerializableAttribute 特性的類型進行序列化,則會引發異常。

如果想讓類中的某個字段不可序列化,可以使用 NonSerializedAttribute 特性。

 

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

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

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);  
  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM