[C#] 說說序列化

来源:http://www.cnblogs.com/liqingwen/archive/2016/09/24/5902005.html
-Advertisement-
Play Games

說說序列化 【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html 序 目錄 序列化 保存對象數據 序列化 保存對象數據 一、序列化 序列化是將對象處理為位元組流以存儲對象或傳輸到記憶體、資料庫或文件。其主要目的是保存對象的狀態,以便可 ...


說說序列化

 【博主】反骨仔    【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html

 

目錄

  • 序列化
  • 保存對象數據

 

一、序列化

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

1.1 序列化的工作方式

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

圖1.1-1

  圖:序列化   對象被序列化為流。流傳遞的不僅是數據,還包括有關對象類型的信息,如對象的版本、區域性和程式集名稱。通過該流,可以將對象存儲在資料庫、文件或記憶體中。

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 使用序列化保存對象

 1     [Serializable]  //將類標記為可序列化
 2     public class Coupon : INotifyPropertyChanged
 3     {
 4         public decimal Amount { get; set; }
 5 
 6         public float InterestRate { get; set; }
 7 
 8         public int Term { get; set; }
 9 
10         private string _name;
11 
12         public string Name
13         {
14             get { return _name; }
15             set
16             {
17                 _name = value;
18                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer"));
19             }
20         }
21 
22         [field: NonSerialized()]    //將可序列化的類中的某欄位標記為不被序列化
23         public event PropertyChangedEventHandler PropertyChanged;
24 
25         public Coupon(decimal amount, float interestRate, int term, string name)
26         {
27             Amount = amount;
28             InterestRate = interestRate;
29             Term = term;
30             _name = name;
31         }
32     }
Coupon.cs
 1         static void Main(string[] args)
 2         {
 3             const string fileName = @"demo1.txt";
 4             var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");
 5 
 6             using (var stream = File.Create(fileName))
 7             {
 8                 var deserializer = new BinaryFormatter();  //二進位格式序列化器
 9                 deserializer.Serialize(stream, coupon);  //序列化對象到文件中
10             }
11         }

圖2-1 

 

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

 1         static void Main(string[] args)
 2         {
 3             const string fileName = @"demo1.txt";
 4             //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");
 5 
 6             //判斷該文件是否存在
 7             if (!File.Exists(fileName))
 8             {
 9                 return;
10             }
11 
12             using (var stream = File.OpenRead(fileName))
13             {
14                 var deserializer = new BinaryFormatter();   //二進位序列化器
15                 var coupon = deserializer.Deserialize(stream) as Coupon;    //反序列化
16 
17                 if (coupon == null)
18                 {
19                     return;
20                 }
21 
22                 Console.WriteLine($"{nameof(Coupon)}:");
23                 Console.WriteLine($"    {nameof(coupon.Amount)}: {coupon.Amount}");
24                 Console.WriteLine($"    {nameof(coupon.InterestRate)}: {coupon.InterestRate}%");
25                 Console.WriteLine($"    {nameof(coupon.Term)}: {coupon.Term}");
26                 Console.WriteLine($"    {nameof(coupon.Name)}: {coupon.Name}");
27             }
28 
29             Console.Read();
30         }

圖2-2

2.2 使用 SOAP 格式保存對象

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

圖2-3

  反序列化時也採用 SoapFormatter 即可,結果同圖2-2。

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

  【註意】本示例將數據存儲到二進位或 SOAP 格式的文件中。不應將這些格式用於敏感數據,如密碼或信用卡信息。

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

  也可以通過 XmlSerializer 將對象序列化保存在 XML 文件。根據需求選擇合適的序列化器,操作基本是一樣的。

 

 

---預覽版,待整理完畢放到首頁---


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天將mac os升級到了10.12,但是第一次關機就一直停著不動,只能強制關機(按電源鍵). 在網上查了下,這是mysql的一個bug. 進入到系統偏好設置中,點擊MySql,取消Automatically start mysql server on startup. ...
  • 1、單次轉換模式 通過配置“模式寄存器的MD2、MD1、MD0為001”,便可啟動單次轉換。 流程“上電 -》 單次轉換 -》 省電模式 ” , 片內振蕩上電需要大約1ms。 單次轉換的時序圖: 數字的含義:0x08 :表示後面的數字是用來設置mode register的; 0x280060:用來設 ...
  • linux free命令查看記憶體使用情況 導讀:linux free命令查看記憶體使用情況,free命令輸出結果的各選項的含義,以及free結果中buffer與cache的區別。 linux free命令查看記憶體使用情況free命令查看記憶體使用: 複製代碼代碼如下: [root@prdmis-db / ...
  • 修改setting.py http://www.cnblogs.com/fengri/articles/django5.html http://unun.in/python/216.html ...
  • 腳本原子化設計理念 運維的目標:運維當中重覆著大量相同相似的工作,機器規模數量一上來,則需要考慮自動化運維,儘量做到第一次人工處理,後面都依賴腳本或者工具和WEB化來完成。這樣編寫shell、python腳本變得非常重要,不僅可以替代很多重覆工作,而且提高效率和減少人工失誤率,我建議即使公司只有10 ...
  • win7下安裝個linux虛擬機,學習下非常好。 但是每次使用linux的時候,都是打開virtualBox-->啟動安裝的linux系統-->再用遠程桌面(SSH等)連接 每次手動打開比較麻煩,而且linux虛擬機也有視窗,比較冗雜。如果能開機自啟,並且後臺運行linux虛擬機(沒有可見視窗),那 ...
  • How To Install Zabbix Server On CentOS 7 By SK How To Install Zabbix Server On CentOS 7 By SK By SK Share on Facebook Tweet on Twitter Share on Facebo ...
  • 需求及環境 學校的教務管理系統需要內網才能登錄,當我不在學校的時候使用外網無法訪問。於是打算把樹莓派部署在寢室並搭建一個VPN伺服器以便我連接以訪問教務管理系統。 樹莓派通過有線連接到一個路由器,路由器撥號訪問網路。 必要軟體安裝 我們需要用到 `pptpd`這2個軟體 配置pptpd 設置ip 編 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...