C#編程基礎之序列化

來源:互聯網
上載者:User
一、序列化的含義

序列化是將對象處理為位元組流以儲存物件或傳輸到記憶體、資料庫或檔案。其主要目的是儲存對象的狀態,以便可以在需要時重新建立對象。相反的過程稱為還原序列化。

1.1 序列化的工作方式

此圖顯示序列化的整個過程。

對象被序列化為流。流傳遞的不僅是資料,還包括有關物件類型的資訊,如對象的版本、地區性和程式集名稱。通過該流,可以將Object Storage Service在資料庫、檔案或記憶體中。

1.2 用於序列化


通過序列化,開發人員可以儲存對象的狀態,並在需要時重新建立該對象,從而提供對象的儲存以及資料交換。通過序列化,開發人員還可以執行類似如下的操作:通過 Web 服務將對象發送到遠程應用程式、將對象從一個域傳遞到另一個域、以 XML 字串的形式跨防火牆傳遞對象,或者跨應用程式維護安全資訊或使用者特定資訊。

1.3 使對象可序列化


若要序列化對象,您需要待序列化的對象、要包含序列化對象的流,以及一個 Formatter。 System.Runtime.Serialization包含序列化和還原序列化對象所需的類。


將 SerializableAttribute 特性應用於一個類型可指示該類型的執行個體可以序列化。嘗試序列化時,如果類型沒有 SerializableAttribute 特性,將引發SerializationException 異常。


如果不希望類中的欄位可序列化,請應用 NonSerializedAttribute 特性。如果可序列化類別型的欄位包含指標、控制代碼或其他一些專用於特定環境的資料結構,並且不能在不同的環境中以有意義的方式重建,則可能需要使該欄位不可序列化。


如果已序列化的類包含對標記為 SerializableAttribute 的其他類的對象的引用,則也將序列化這些對象。

1.3.1 二進位序列化和 XML 序列化


可以使用二進位序列化或 XML 序列化。在二進位序列化中,會序列化所有成員(甚至包括那些唯讀成員),從而可以提高效能。XML 序列化提供了可讀性更好的代碼,並在對象共用和使用方面提供了更大的靈活性,以便實現互通性。

1.3.2 二進位序列化


二進位序列化使用二進位編碼來產生精簡的序列化,以用於儲存或基於通訊端的網路流等。

1.3.3 XML 序列化


XML 序列化將對象的公用欄位和屬性或者方法的參數及傳回值序列化為符合特定 XML 結構定義語言 (XSD) 文檔的 XML 流。XML 序列化會產生具有轉換為 XML 的公用屬性和欄位的強型別類。 System.Xml.Serialization 包含序列化和還原序列化 XML 所需的類。


您可以將特性應用於類和類成員,以控制 XmlSerializer 序列化或還原序列化類執行個體的方式。

1.3.4 SOAP 序列化


XML 序列化還可用於將對象序列化為符合 SOAP 規範的 XML 流。SOAP 是一種基於 XML 的協議,它是專門為使用 XML 來傳輸程序呼叫而設計的。如同常規的 XML 序列化,特性可用於控制 XML Web services 產生的文本樣式的 SOAP 訊息。

1.3.5 基本序列化和自訂序列化


可以通過兩種方式執行序列化:基本序列化和自訂序列化。基本序列化使用 .NET Framework 來自動序列化對象。

1.3.5.1 基本序列化


基本序列化的唯一要求是對象必須應用 SerializableAttribute 特性。


NonSerializedAttribute 可用于禁止序列化特定欄位。


使用基本序列化時,對象的版本控制可能會產生問題,在這種情況下,自訂序列化可能更合適。基本序列化是執行序列化的最簡單的方法,但對進程提供的控制並不多。

1.3.5.2 自訂序列化

在自訂序列化中,可以準確地指定將序列化哪些對象以及如何完成序列化。類必須標記為 SerializableAttribute,並實現 ISerializable 介面。

如果希望同樣以自訂方式還原序列化對象,則必須使用自訂建構函式。

1.3.6 設計器序列

設計器序列化是一種特殊形式的序列化,它涉及通常與開發工具關聯的對象持久性的種類。設計器序列化是將對象圖轉換為以後可用於恢複對象圖的源檔案的過程。源檔案可以包含代碼、標記,甚至包含 SQL 表資訊。有關更多資訊,請參見Designer Serialization Overview。

二、通過序列化儲存對象資料

雖然您可以在設計時將對象的屬性設定為預設值,但是,如果該對象被損環,則在運行時輸入的所有值均會丟失。 可以使用序列化在執行個體之間保持對象資料,從而能夠儲存值並且在下次執行個體化對象時檢索這些值。

在本演練中,將建立一個簡單的對象,並將該對象的資料儲存到檔案中。然後,當您重新建立對象時將從該檔案檢索資料。最後,將修改代碼以使用 SOAP 格式保持對象。

2.1 使用序列化儲存對象

   [Serializable]  //將類標記為可序列化    public class Coupon : INotifyPropertyChanged    {        public decimal Amount { get; set; }        public float InterestRate { get; set; }        public int Term { get; set; }        private string _name;        public string Name        {            get { return _name; }            set            {                _name = value;                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer"));            }        }        [field: NonSerialized()]    //將可序列化的類中的某欄位標記為不被序列化        public event PropertyChangedEventHandler PropertyChanged;        public Coupon(decimal amount, float interestRate, int term, string name)        {            Amount = amount;            InterestRate = interestRate;            Term = term;            _name = name;        }    }static void Main(string[] args){            const string fileName = @"demo1.txt";            var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            using (var stream = File.Create(fileName))            {                var deserializer = new BinaryFormatter();  //二進位格式序列化器                deserializer.Serialize(stream, coupon);  //序列化對象到檔案中            }}

現在嘗試還原序列化,看看與之前 Coupon 對象的值是否一致。

static void Main(string[] args){            const string fileName = @"demo1.txt";            //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            //判斷該檔案是否存在            if (!File.Exists(fileName))            {                return;            }            using (var stream = File.OpenRead(fileName))            {                var deserializer = new BinaryFormatter();   //二進位序列化器                var coupon = deserializer.Deserialize(stream) as Coupon;    //還原序列化                if (coupon == null)                {                    return;                }                Console.WriteLine($"{nameof(Coupon)}:");                Console.WriteLine($"    {nameof(coupon.Amount)}: {coupon.Amount}");                Console.WriteLine($"    {nameof(coupon.InterestRate)}: {coupon.InterestRate}%");                Console.WriteLine($"    {nameof(coupon.Term)}: {coupon.Term}");                Console.WriteLine($"    {nameof(coupon.Name)}: {coupon.Name}");            }            Console.Read();}


2.2 使用 SOAP 格式儲存對象

static void Main(string[] args){            const string fileName = @"demo1.txt";            var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");            using (var stream = File.Create(fileName))            {                var deserializer = new SoapFormatter(); //Soap 格式化器                deserializer.Serialize(stream, coupon); //序列化            }}

還原序列化時也採用 SoapFormatter 即可

var deserializer = new SoapFormatter();   //Soap 格式化器var coupon = deserializer.Deserialize(stream) as Coupon;    //還原序列化

【注意】本樣本將資料存放區到二進位或 SOAP 格式的檔案中。不應將這些格式用于敏感資料,如密碼或信用卡資訊。


【備忘】二進位格式對於大多數 Windows 應用程式均適用。但對於 Web 應用程式或 Web 服務,您可能希望使用 SOAP 格式將對象儲存到 XML 檔案中,以使對象易於共用。


同樣,也可以通過 XmlSerializer 將對象序列化儲存在 XML 檔案。我們可以根據需求選擇合適的序列化器,操作基本是一樣的。

以上就是C#編程基礎之序列化的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.