iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Software Development

玩轉C# 進階學習之旅系列 第 12

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

  • 分享至 

  • xImage
  •  

介紹

序列化、反序列化概念:

如圖,假設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/


上一篇
玩轉C#之【委派&事件】
下一篇
玩轉C#之【LINQ 基本介紹】
系列文
玩轉C# 進階學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言