[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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...