玩轉C#之【序列化、反序列化】

玩轉C#之【序列化、反序列化】

更新於 發佈於 閱讀時間約 10 分鐘

介紹

序列化、反序列化概念:

如圖,假設Platefrom1是我們的.Net的程式,我們要將我們物件的資料傳遞給另一個程式,其他程式無法直接讀取我們的記憶體,所以我們必須將資料轉變成二進制檔案或者是字串,這個步驟就是序列化
當另一個程式收到了我們的檔案,他必須將收到的二進制檔案或者是字串轉換成原本的物件,這就是反序列化

關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解

使用方式

測試資料

SerializableAttribute 微軟說明文件

[Serializable]//必須加上的序列化特性
public class Person
{
[NonSerialized]
public int Id = 1;

public string Name { get; set; }

public string Sex { get; set; }
}

[Serializable]//必須加上的序列化特性
public class Programmer : Person
{
private string Language { get; set; }
public string Description { get; set; }
}

public class DataFactory
{
public static List<Programmer> BuildProgrammerList()
{
List<Programmer> list = new List<Programmer>();
list.Add(new Programmer()
{ Id = 1, Description = "一年級學生", Name = "大俠愛吃漢堡寶", Sex = "男"
});
return list;
}
}

二進位序列化

雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了

BinaryFormatter 序列化方法在 ASP.NET 應用程式中已過時且禁止

void Main()
{
BinarySerialize();
}
public static void BinarySerialize()
{
//使用二進位序列化
string fileName = Path.Combine("C:\\Users\\TX\\", @"BinarySerialize.txt");//文件
//需要一个stream,直接寫入檔案
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
List<Programmer> pList = DataFactory.BuildProgrammerList();//測試資料
BinaryFormatter binFormat = new BinaryFormatter();//二進位序列化器
binFormat.Serialize(fStream, pList);//序列化
}
//使用二進位反序列化
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{
BinaryFormatter binFormat = new BinaryFormatter();//二進位序列化器 /
fStream.Position = 0;//重置流位置
List<Programmer> pList = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化
pList.Dump();
}
}

SOAP 序列化

雖然這裡介紹SoapFormatter但在 .NET Framework 2.0 開始,這個類別已過時。

public static void SoapSerialize()
{

string fileName = Path.Combine("C:\\Users\\TX\\", @"SoapSerialize.txt");
//序列化
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
List<Programmer> pList = DataFactory.BuildProgrammerList();
SoapFormatter soapFormat = new SoapFormatter();

soapFormat.Serialize(fStream, pList.ToArray());//序列化
}
//反序列化
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{
SoapFormatter soapFormat = new SoapFormatter();

fStream.Position = 0;//重置流位置
List<Programmer> pList = ((Programmer[])soapFormat.Deserialize(fStream)).ToList();//反序列化
}
}

XML

XmlSerializer 類別

/// <summary>
/// XML序列化器
/// </summary>
public static void XmlSerialize()
{
//使用XML序列化
string fileName = Path.Combine("C:\\Users\\TX\\", @"XmlSerialize.txt");//文件
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
List<Programmer> pList = DataFactory.BuildProgrammerList();
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));//
xmlFormat.Serialize(fStream, pList);
}
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));

fStream.Position = 0;//重置流位置
List<Programmer> pList = pList = (List<Programmer>)xmlFormat.Deserialize(fStream);
}
}

JSON

C#3.0開始導入的JsonSerializer
JsonSerializer

var data = DataFactory.BuildProgrammerList();
//序列化
var json = JsonSerializer.Serialize<List<Programmer>>(data);
//反序列化
var desData = JsonSerializer.Deserialize<List<Programmer>>(json);

參考資料

如何在 .NET 中序列化和還原序列化 (封送處理和 unmarshal) JSON
XmlDocument 類別

本篇已同步發表至個人部落格
https://moushih.com/2022ithome12/

鐵人賽文章列表

https://ithelp.ithome.com.tw/articles/10289494

avatar-img
一代軍師
8會員
39內容數
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
留言
avatar-img
留言分享你的想法!
一代軍師 的其他內容
盤面基本組成要素 十天干:甲乙丙丁戊己庚辛壬癸 十二地支:子丑寅卯辰巳午未申酉戌亥 五行:木、火、土、金、水 八門:休、生、傷、杜、景、死、驚、開 八神:符、蛇、陰、合、虎、武、九、天 九星:蓬、任、沖、輔、英、芮、柱、心、禽 八卦:坎、艮、震、兌、離、坤、乾 六個旬首:甲子戊、甲戊
Drawmind 畫鏡 主要目的是透過藝術治療,幫助個人減輕情感壓力、提升心理健康,並提供一個具有專業指導的平台,讓用戶進行情感表達、自我探索和康復。
原理 八字 八字不等於出生時間 八字是根據每個兩小時為一個單位的時辰來劃分的。 它包括年、月、日和時這四個要素,其中年、月、日分別對應天干地支。 即使缺少具體出生時刻,也仍然可以排出命盤進行分析。 紫微斗數 需要精確的出生的小時數,因為出生時間的稍微差異呈現出來的命盤會有天差地別,從而
盤面基本組成要素 十天干:甲乙丙丁戊己庚辛壬癸 十二地支:子丑寅卯辰巳午未申酉戌亥 五行:木、火、土、金、水 八門:休、生、傷、杜、景、死、驚、開 八神:符、蛇、陰、合、虎、武、九、天 九星:蓬、任、沖、輔、英、芮、柱、心、禽 八卦:坎、艮、震、兌、離、坤、乾 六個旬首:甲子戊、甲戊
Drawmind 畫鏡 主要目的是透過藝術治療,幫助個人減輕情感壓力、提升心理健康,並提供一個具有專業指導的平台,讓用戶進行情感表達、自我探索和康復。
原理 八字 八字不等於出生時間 八字是根據每個兩小時為一個單位的時辰來劃分的。 它包括年、月、日和時這四個要素,其中年、月、日分別對應天干地支。 即使缺少具體出生時刻,也仍然可以排出命盤進行分析。 紫微斗數 需要精確的出生的小時數,因為出生時間的稍微差異呈現出來的命盤會有天差地別,從而