C#中的序列化與反序列化方式
前言
在 C# 編程中,序列化和反序列化是非常重要的概念。
序列化是將對象轉(zhuǎn)換為可以存儲或傳輸?shù)母袷降倪^程,而反序列化則是將存儲或傳輸?shù)母袷睫D(zhuǎn)換回對象的過程。
這兩個過程在許多應(yīng)用場景中都非常有用,例如保存對象狀態(tài)、在網(wǎng)絡(luò)上傳輸對象、在不同的應(yīng)用程序之間共享數(shù)據(jù)等。
一、序列化的概念和目的
1. 概念
序列化是將對象的狀態(tài)轉(zhuǎn)換為可以存儲或傳輸?shù)母袷降倪^程。
在 C# 中,可以使用多種方式進(jìn)行序列化,例如使用二進(jìn)制序列化、XML 序列化或 JSON 序列化等。
2. 目的
- 數(shù)據(jù)存儲: 將對象的狀態(tài)保存到文件、數(shù)據(jù)庫或其他存儲介質(zhì)中,以便在以后需要時可以重新加載并恢復(fù)對象的狀態(tài)。
- 網(wǎng)絡(luò)傳輸: 將對象的狀態(tài)通過網(wǎng)絡(luò)發(fā)送到其他計算機(jī)或設(shè)備上,以便在接收端可以重新創(chuàng)建對象并恢復(fù)其狀態(tài)。
- 數(shù)據(jù)共享: 在不同的應(yīng)用程序之間共享對象的狀態(tài),以便可以在不同的環(huán)境中使用相同的數(shù)據(jù)。
二、反序列化的概念和目的
1. 概念
反序列化是將存儲或傳輸?shù)母袷睫D(zhuǎn)換回對象的過程。
在 C# 中,可以使用與序列化相同的方式進(jìn)行反序列化,例如使用二進(jìn)制序列化、XML 序列化或 JSON 序列化等。
2. 目的
- 數(shù)據(jù)恢復(fù): 從存儲介質(zhì)中讀取序列化的數(shù)據(jù),并將其轉(zhuǎn)換回對象的狀態(tài),以便可以繼續(xù)使用對象。
- 網(wǎng)絡(luò)接收: 接收通過網(wǎng)絡(luò)發(fā)送的序列化數(shù)據(jù),并將其轉(zhuǎn)換回對象的狀態(tài),以便可以在本地處理對象。
- 數(shù)據(jù)共享: 從其他應(yīng)用程序接收到共享的序列化數(shù)據(jù),并將其轉(zhuǎn)換回對象的狀態(tài),以便可以在本地使用相同的數(shù)據(jù)。
三、C# 中的序列化方法
1. 二進(jìn)制序列化
使用方法:使用BinaryFormatter類進(jìn)行二進(jìn)制序列化。
首先,需要在代碼中引入System.Runtime.Serialization.Formatters.Binary命名空間。
然后,可以創(chuàng)建一個BinaryFormatter對象,并使用Serialize方法將對象序列化為字節(jié)流,使用Deserialize方法將字節(jié)流反序列化為對象。
using System.IO; using System.Runtime.Serialization.Formatters.Binary; class Program { static void Main() { // 創(chuàng)建一個要序列化的對象 MyClass obj = new MyClass { Name = "John", Age = 30 }; // 使用二進(jìn)制序列化將對象序列化為字節(jié)流 using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); // 將字節(jié)流轉(zhuǎn)換為字節(jié)數(shù)組 byte[] data = stream.ToArray(); // 使用二進(jìn)制反序列化將字節(jié)數(shù)組反序列化為對象 using (MemoryStream stream2 = new MemoryStream(data)) { BinaryFormatter formatter2 = new BinaryFormatter(); MyClass deserializedObj = (MyClass)formatter2.Deserialize(stream2); Console.WriteLine(deserializedObj.Name); Console.WriteLine(deserializedObj.Age); } } } } [Serializable] class MyClass { public string Name { get; set; } public int Age { get; set; } }
特點(diǎn):
- 二進(jìn)制序列化是一種高效的序列化方式,可以快速地將對象序列化為字節(jié)流,并在需要時快速地將字節(jié)流反序列化為對象。
- 二進(jìn)制序列化生成的字節(jié)流是緊湊的,占用的存儲空間較小。
- 二進(jìn)制序列化是一種私有序列化方式,只有使用相同的程序集和類型定義才能進(jìn)行反序列化。
2. XML 序列化
使用方法:使用XmlSerializer類進(jìn)行 XML 序列化。
首先,需要在代碼中引入System.Xml.Serialization命名空間。
然后,可以創(chuàng)建一個XmlSerializer對象,并使用Serialize方法將對象序列化為 XML 文檔,使用Deserialize方法將 XML 文檔反序列化為對象。
using System.IO; using System.Xml.Serialization; class Program { static void Main() { // 創(chuàng)建一個要序列化的對象 MyClass obj = new MyClass { Name = "John", Age = 30 }; // 使用 XML 序列化將對象序列化為 XML 文檔 using (StringWriter writer = new StringWriter()) { XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); serializer.Serialize(writer, obj); string xml = writer.ToString(); // 使用 XML 反序列化將 XML 文檔反序列化為對象 using (StringReader reader = new StringReader(xml)) { XmlSerializer serializer2 = new XmlSerializer(typeof(MyClass)); MyClass deserializedObj = (MyClass)serializer2.Deserialize(reader); Console.WriteLine(deserializedObj.Name); Console.WriteLine(deserializedObj.Age); } } } } [Serializable] [XmlRoot("MyClass")] class MyClass { public string Name { get; set; } public int Age { get; set; } }
特點(diǎn):
- XML 序列化生成的 XML 文檔是一種人類可讀的格式,可以方便地進(jìn)行查看和編輯。
- XML 序列化是一種公開的序列化方式,可以在不同的平臺和編程語言之間進(jìn)行數(shù)據(jù)交換。
- XML 序列化生成的 XML 文檔通常比二進(jìn)制序列化生成的字節(jié)流占用更多的存儲空間。
3. JSON 序列化
使用方法:使用JsonSerializer類進(jìn)行 JSON 序列化。
首先,需要在代碼中引入System.Text.Json命名空間。
然后,可以創(chuàng)建一個JsonSerializerOptions對象,并設(shè)置序列化選項(xiàng),例如縮進(jìn)格式、屬性名稱大小寫等。
最后,可以使用JsonSerializer.Serialize方法將對象序列化為 JSON 字符串,使用JsonSerializer.Deserialize方法將 JSON 字符串反序列化為對象。
using System.Text.Json; class Program { static void Main() { // 創(chuàng)建一個要序列化的對象 MyClass obj = new MyClass { Name = "John", Age = 30 }; // 使用 JSON 序列化將對象序列化為 JSON 字符串 string json = JsonSerializer.Serialize(obj); // 使用 JSON 反序列化將 JSON 字符串反序列化為對象 MyClass deserializedObj = JsonSerializer.Deserialize<MyClass>(json); Console.WriteLine(deserializedObj.Name); Console.WriteLine(deserializedObj.Age); } } class MyClass { public string Name { get; set; } public int Age { get; set; } }
特點(diǎn):
- JSON 序列化生成的 JSON 字符串是一種輕量級的數(shù)據(jù)交換格式,占用的存儲空間較小,并且易于在不同的平臺和編程語言之間進(jìn)行數(shù)據(jù)交換。
- JSON 序列化是一種人類可讀的格式,可以方便地進(jìn)行查看和編輯。
- JSON 序列化可以使用第三方庫進(jìn)行擴(kuò)展,例如 Newtonsoft.Json,提供更多的功能和選項(xiàng)。
四、總結(jié)
序列化和反序列化是 C# 編程中非常重要的概念,可以方便地進(jìn)行數(shù)據(jù)存儲、網(wǎng)絡(luò)傳輸和數(shù)據(jù)共享等操作。
在 C# 中,可以使用二進(jìn)制序列化、XML 序列化和 JSON 序列化等方式進(jìn)行序列化和反序列化。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
WPF實(shí)現(xiàn)類似360安全衛(wèi)士界面的程序源碼分享
最近在網(wǎng)上看到了新版的360安全衛(wèi)士,感覺界面還不錯,于是用WPF制作了一個,時間有限,一些具體的控件沒有制作,用圖片代替了。感興趣的朋友一起跟著小編學(xué)習(xí)WPF實(shí)現(xiàn)類似360安全衛(wèi)士界面的程序源碼分享2015-09-09C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密
這篇文章主要介紹了C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密,需要的朋友參考下2017-01-01詳解C# 泛型中的數(shù)據(jù)類型判定與轉(zhuǎn)換
這篇文章主要介紹了C# 泛型中的數(shù)據(jù)類型判定與轉(zhuǎn)換,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C#實(shí)現(xiàn)簡單的loading提示控件實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了C#實(shí)現(xiàn)簡單的loading提示控件功能,代碼非常簡單,具有參考借鑒價值,需要的朋友參考下吧2017-09-09C# List實(shí)現(xiàn)行轉(zhuǎn)列的通用方案
本篇通過行轉(zhuǎn)列引出了System.Linq.Dynamic,并且介紹了過濾功能,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03