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

閱讀時間約 9 分鐘

介紹

序列化、反序列化概念:
如圖,假設Platefrom1是我們的.Net的程式,我們要將我們物件的資料傳遞給另一個程式,其他程式無法直接讀取我們的記憶體,所以我們必須將資料轉變成二進制檔案或者是字串,這個步驟就是序列化
當另一個程式收到了我們的檔案,他必須將收到的二進制檔案或者是字串轉換成原本的物件,這就是反序列化
📷
關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解

使用方式

測試資料

[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中已經屬於過時的方法了
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

/// <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);
📷
📷

參考資料

本篇已同步發表至個人部落格
https://moushih.com/2022ithome12/
鐵人賽文章列表
為什麼會看到廣告
8會員
39Content count
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
留言0
查看全部
發表第一個留言支持創作者!
一代軍師 的其他內容
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
介紹 分層架構模式,是將一個軟體系統進行分層,每個軟體系統都去要通過層來隔離不同的關注點,其中最為經典的就是三層架構以及領域驅動設計提出的四層架構。 📷 三層式架構 下面會介紹每一層專門要處理的事情 最常是用的分層方式 至於每層模組的命名方式,每間公司都不太ㄧ樣 📷 參考資料 鐵人賽文章
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
介紹 在程式中你看到上面有一個中括號[] 就是特性,它自身沒有任何功能。 📷 特性attribute,和注釋有什麼區別 第一個感受 特性:中括號宣告 錯覺:每一個特性都可以帶來對應的功能 實際上添加後,編譯器會在元素內部產生IL,但是我們是沒辦法直接使用的,而且在metadata會有紀錄 📷
介紹 反射:System.Reflection .Net框架提供的Library,可以讀取並使用metadata Dll-IL-Metadata-反射 透過VS編譯器 編譯成dll/exe 點擊exe的時候,他有一個依賴的環境叫做CLR IL:可以透過ILSpy(反編譯工具) 📷 一般情況
介紹 在C#2.0時代以前,是沒有泛型的,所以當我們遇到需求是方法內做相同的事情,但因為輸入或輸出的型別不一樣,我們就必須重複寫出類似的程式 以下的例子是=>不同的輸入型別 但卻做相同的事情 =>印出輸入資料 範例: 輸入參數:int或string或DateTime 功能:印出輸入的"數值"
介紹 分層架構模式,是將一個軟體系統進行分層,每個軟體系統都去要通過層來隔離不同的關注點,其中最為經典的就是三層架構以及領域驅動設計提出的四層架構。 📷 三層式架構 下面會介紹每一層專門要處理的事情 最常是用的分層方式 至於每層模組的命名方式,每間公司都不太ㄧ樣 📷 參考資料 鐵人賽文章
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜