C#中的序列化與反序列化方式
前言
在 C# 編程中,序列化和反序列化是非常重要的概念。
序列化是將對(duì)象轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)母袷降倪^(guò)程,而反序列化則是將存儲(chǔ)或傳輸?shù)母袷睫D(zhuǎn)換回對(duì)象的過(guò)程。
這兩個(gè)過(guò)程在許多應(yīng)用場(chǎng)景中都非常有用,例如保存對(duì)象狀態(tài)、在網(wǎng)絡(luò)上傳輸對(duì)象、在不同的應(yīng)用程序之間共享數(shù)據(jù)等。
一、序列化的概念和目的
1. 概念
序列化是將對(duì)象的狀態(tài)轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)母袷降倪^(guò)程。
在 C# 中,可以使用多種方式進(jìn)行序列化,例如使用二進(jìn)制序列化、XML 序列化或 JSON 序列化等。
2. 目的
- 數(shù)據(jù)存儲(chǔ): 將對(duì)象的狀態(tài)保存到文件、數(shù)據(jù)庫(kù)或其他存儲(chǔ)介質(zhì)中,以便在以后需要時(shí)可以重新加載并恢復(fù)對(duì)象的狀態(tài)。
- 網(wǎng)絡(luò)傳輸: 將對(duì)象的狀態(tài)通過(guò)網(wǎng)絡(luò)發(fā)送到其他計(jì)算機(jī)或設(shè)備上,以便在接收端可以重新創(chuàng)建對(duì)象并恢復(fù)其狀態(tài)。
- 數(shù)據(jù)共享: 在不同的應(yīng)用程序之間共享對(duì)象的狀態(tài),以便可以在不同的環(huán)境中使用相同的數(shù)據(jù)。
二、反序列化的概念和目的
1. 概念
反序列化是將存儲(chǔ)或傳輸?shù)母袷睫D(zhuǎn)換回對(duì)象的過(guò)程。
在 C# 中,可以使用與序列化相同的方式進(jìn)行反序列化,例如使用二進(jìn)制序列化、XML 序列化或 JSON 序列化等。
2. 目的
- 數(shù)據(jù)恢復(fù): 從存儲(chǔ)介質(zhì)中讀取序列化的數(shù)據(jù),并將其轉(zhuǎn)換回對(duì)象的狀態(tài),以便可以繼續(xù)使用對(duì)象。
- 網(wǎng)絡(luò)接收: 接收通過(guò)網(wǎng)絡(luò)發(fā)送的序列化數(shù)據(jù),并將其轉(zhuǎn)換回對(duì)象的狀態(tài),以便可以在本地處理對(duì)象。
- 數(shù)據(jù)共享: 從其他應(yīng)用程序接收到共享的序列化數(shù)據(jù),并將其轉(zhuǎn)換回對(duì)象的狀態(tài),以便可以在本地使用相同的數(shù)據(jù)。
三、C# 中的序列化方法
1. 二進(jìn)制序列化
使用方法:使用BinaryFormatter類(lèi)進(jìn)行二進(jìn)制序列化。
首先,需要在代碼中引入System.Runtime.Serialization.Formatters.Binary命名空間。
然后,可以創(chuàng)建一個(gè)BinaryFormatter對(duì)象,并使用Serialize方法將對(duì)象序列化為字節(jié)流,使用Deserialize方法將字節(jié)流反序列化為對(duì)象。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
static void Main()
{
// 創(chuàng)建一個(gè)要序列化的對(duì)象
MyClass obj = new MyClass { Name = "John", Age = 30 };
// 使用二進(jìn)制序列化將對(duì)象序列化為字節(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ù)組反序列化為對(duì)象
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)制序列化是一種高效的序列化方式,可以快速地將對(duì)象序列化為字節(jié)流,并在需要時(shí)快速地將字節(jié)流反序列化為對(duì)象。
- 二進(jìn)制序列化生成的字節(jié)流是緊湊的,占用的存儲(chǔ)空間較小。
- 二進(jìn)制序列化是一種私有序列化方式,只有使用相同的程序集和類(lèi)型定義才能進(jìn)行反序列化。
2. XML 序列化
使用方法:使用XmlSerializer類(lèi)進(jìn)行 XML 序列化。
首先,需要在代碼中引入System.Xml.Serialization命名空間。
然后,可以創(chuàng)建一個(gè)XmlSerializer對(duì)象,并使用Serialize方法將對(duì)象序列化為 XML 文檔,使用Deserialize方法將 XML 文檔反序列化為對(duì)象。
using System.IO;
using System.Xml.Serialization;
class Program
{
static void Main()
{
// 創(chuàng)建一個(gè)要序列化的對(duì)象
MyClass obj = new MyClass { Name = "John", Age = 30 };
// 使用 XML 序列化將對(duì)象序列化為 XML 文檔
using (StringWriter writer = new StringWriter())
{
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
serializer.Serialize(writer, obj);
string xml = writer.ToString();
// 使用 XML 反序列化將 XML 文檔反序列化為對(duì)象
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 文檔是一種人類(lèi)可讀的格式,可以方便地進(jìn)行查看和編輯。
- XML 序列化是一種公開(kāi)的序列化方式,可以在不同的平臺(tái)和編程語(yǔ)言之間進(jìn)行數(shù)據(jù)交換。
- XML 序列化生成的 XML 文檔通常比二進(jìn)制序列化生成的字節(jié)流占用更多的存儲(chǔ)空間。
3. JSON 序列化
使用方法:使用JsonSerializer類(lèi)進(jìn)行 JSON 序列化。
首先,需要在代碼中引入System.Text.Json命名空間。
然后,可以創(chuàng)建一個(gè)JsonSerializerOptions對(duì)象,并設(shè)置序列化選項(xiàng),例如縮進(jìn)格式、屬性名稱(chēng)大小寫(xiě)等。
最后,可以使用JsonSerializer.Serialize方法將對(duì)象序列化為 JSON 字符串,使用JsonSerializer.Deserialize方法將 JSON 字符串反序列化為對(duì)象。
using System.Text.Json;
class Program
{
static void Main()
{
// 創(chuàng)建一個(gè)要序列化的對(duì)象
MyClass obj = new MyClass { Name = "John", Age = 30 };
// 使用 JSON 序列化將對(duì)象序列化為 JSON 字符串
string json = JsonSerializer.Serialize(obj);
// 使用 JSON 反序列化將 JSON 字符串反序列化為對(duì)象
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 字符串是一種輕量級(jí)的數(shù)據(jù)交換格式,占用的存儲(chǔ)空間較小,并且易于在不同的平臺(tái)和編程語(yǔ)言之間進(jìn)行數(shù)據(jù)交換。
- JSON 序列化是一種人類(lèi)可讀的格式,可以方便地進(jìn)行查看和編輯。
- JSON 序列化可以使用第三方庫(kù)進(jìn)行擴(kuò)展,例如 Newtonsoft.Json,提供更多的功能和選項(xiàng)。
四、總結(jié)
序列化和反序列化是 C# 編程中非常重要的概念,可以方便地進(jìn)行數(shù)據(jù)存儲(chǔ)、網(wǎng)絡(luò)傳輸和數(shù)據(jù)共享等操作。
在 C# 中,可以使用二進(jìn)制序列化、XML 序列化和 JSON 序列化等方式進(jìn)行序列化和反序列化。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#?SetWindowPos函數(shù)實(shí)例詳解
在C#中,SetWindowPos函數(shù)用于設(shè)置窗口的位置和大小,這篇文章主要介紹了C#?SetWindowPos函數(shù)實(shí)例詳解,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
C#實(shí)現(xiàn)主窗體最小化后出現(xiàn)懸浮框及雙擊懸浮框恢復(fù)原窗體的方法
這篇文章主要介紹了C#實(shí)現(xiàn)主窗體最小化后出現(xiàn)懸浮框及雙擊懸浮框恢復(fù)原窗體的方法,涉及C#窗體及鼠標(biāo)事件響應(yīng)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)包裹面單打印的四種主流實(shí)現(xiàn)方式(從 WinForm 到云打印)
在電商、倉(cāng)儲(chǔ)、物流等系統(tǒng)中,“打印快遞面單”是高頻且關(guān)鍵的操作,本文將系統(tǒng)梳理C#應(yīng)用中四種主流實(shí)現(xiàn)方式,涵蓋本地驅(qū)動(dòng)打印、模板引擎生成、第三方 SDK 集成及云打印服務(wù)對(duì)接,并提供核心代碼示例與選型建議,需要的朋友可以參考下2026-02-02
C#利用時(shí)間和隨即字符串創(chuàng)建唯一的訂單編號(hào)
本文介紹了利用時(shí)間和隨機(jī)字符串組合生成唯一訂單號(hào)的示例,從而保證訂單號(hào)不會(huì)重復(fù),希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2016-03-03
C#中Newtonsoft.Json 到 System.Text.Json 遷移避坑指南
本文主要介紹了C#中Newtonsoft.Json 到 System.Text.Json 遷移避坑指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
C#查找對(duì)象在ArrayList中出現(xiàn)位置的方法
這篇文章主要介紹了C#查找對(duì)象在ArrayList中出現(xiàn)位置的方法,涉及C#中IndexOf方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04最新評(píng)論

