C#對象持久化的三種常用序列化方法總結
一、對象本地保存的基本問題
對象在程序運行時存儲在內存中,程序關閉后會被垃圾回收機制銷毀,無法保留狀態(tài)。若需在程序再次運行時恢復對象狀態(tài),需將對象信息持久化到磁盤(如文件)中。
原始保存方式的局限
直接將對象屬性按順序寫入文本文件(如People.obj),通過順序讀取還原對象,存在明顯缺點:
- 強依賴順序:存儲與讀取順序必須完全一致,否則數據錯亂;
- 可讀性差:無法直觀區(qū)分文件中各字段對應對象的哪個屬性;
- 擴展性差:對象新增屬性時,需修改存儲和讀取的全部邏輯。
二、序列化與反序列化
為解決原始保存方式的問題,引入 “序列化” 和 “反序列化” 機制:
- 序列化:將對象狀態(tài)轉換為可存儲(如文件)或可傳輸(如網絡)的格式(二進制、XML、JSON 等)的過程。
- 反序列化:將序列化后的格式(如二進制流、JSON 文本)還原為對象的過程。
三、三種常用序列化方式
1. 二進制序列化
將對象轉換為二進制流,效率高、體積小,但可讀性差(二進制無法直接看懂)。
核心組件
BinaryFormatter:位于System.Runtime.Serialization.Formatters.Binary命名空間,負責二進制序列化與反序列化。
使用步驟
- 標記類為可序列化:在類定義前添加
[Serializable]特性(否則序列化失?。?; - 創(chuàng)建文件流:通過
FileStream指定存儲路徑和模式(如FileMode.Create創(chuàng)建文件); - 實例化序列化器:創(chuàng)建
BinaryFormatter對象; - 執(zhí)行序列化 / 反序列化:調用
Serialize()(寫入對象)或Deserialize()(讀取對象); - 釋放資源:關閉文件流。
示例代碼
// 1. 定義可序列化的類
[Serializable] // 必須添加此特性
public class People
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string Birth { get; set; }
}
?
// 2. 序列化過程
public void BinarySerialize()
{
People people = new People()
{
Name = "吳凡",
Age = 18,
Sex = "男",
Birth = "2005-01-01"
};
?
// 創(chuàng)建文件流
using (FileStream fs = new FileStream("people.bin", FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, people); // 將對象寫入流
}
}
?
// 3. 反序列化過程
public void BinaryDeserialize()
{
using (FileStream fs = new FileStream("people.bin", FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
// 反序列化并轉換為People類型
People people = bf.Deserialize(fs) as People;
Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
}
}特點
- 優(yōu)點:效率高(二進制傳輸快)、體積?。?/li>
- 缺點:不可讀(無法直接查看文件內容)、僅限.NET 平臺(跨平臺兼容性差)。
2. JSON 序列化
JSON(JavaScript Object Notation)是一種輕量級文本格式,易讀易寫,跨平臺兼容性強(支持多語言),是目前最常用的序列化格式之一。
JSON 格式示例:
{ "Name":"吳凡", "Age":18, "Sex":"男", "Birth":"2005-01-01" }方式 1:原生DataContractJsonSerializer
依賴System.Runtime.Serialization.Json命名空間,需手動標記類和屬性。
使用步驟
- 標記類和屬性:類添加
[DataContract],需序列化的屬性添加[DataMember]; - 創(chuàng)建文件流:指定 JSON 文件路徑;
- 實例化序列化器:
DataContractJsonSerializer需指定對象類型(如typeof(People)); - 序列化 / 反序列化:調用
WriteObject()(序列化)或ReadObject()(反序列化)。
示例代碼
// 1. 定義數據契約類
using System.Runtime.Serialization;
?
[DataContract] // 標記為數據契約類
public class People
{
[DataMember] // 標記為需序列化的成員
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string Sex { get; set; }
[DataMember]
public string Birth { get; set; }
}
?
// 2. 序列化
public void JsonSerialize_Native()
{
People people = new People()
{
Name = "吳凡",
Age = 18,
Sex = "男",
Birth = "2005-01-01"
};
?
using (FileStream fs = new FileStream("people.json", FileMode.Create))
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(People));
jsonSerializer.WriteObject(fs, people); // 寫入JSON
}
}
?
// 3. 反序列化
public void JsonDeserialize_Native()
{
using (FileStream fs = new FileStream("people.json", FileMode.Open))
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(People));
People people = jsonSerializer.ReadObject(fs) as People; // 讀取JSON并轉換為對象
Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
}
}方式 2:第三方Newtonsoft.Json(推薦)
最流行的 JSON 處理庫,簡化序列化邏輯,無需標記特性,支持復雜對象和集合。
使用步驟
- 安裝庫:項目右鍵→“管理 NuGet 程序包”→搜索 “Newtonsoft.Json”→安裝;
- 引入命名空間:
using Newtonsoft.Json;; - 序列化:調用
JsonConvert.SerializeObject(對象)生成 JSON 字符串,寫入文件; - 反序列化:讀取 JSON 字符串,調用
JsonConvert.DeserializeObject<類型>(字符串)還原對象。
示例代碼
using Newtonsoft.Json;
?
// 1. 定義普通類(無需任何特性)
public class People
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string Birth { get; set; }
}
?
// 2. 序列化
public void JsonSerialize_Newtonsoft()
{
People people = new People()
{
Name = "吳凡",
Age = 18,
Sex = "男",
Birth = "2005-01-01"
};
?
// 轉換對象為JSON字符串
string jsonStr = JsonConvert.SerializeObject(people);
// 寫入文件
File.WriteAllText("people.json", jsonStr);
}
?
// 3. 反序列化
public void JsonDeserialize_Newtonsoft()
{
// 讀取JSON字符串
string jsonStr = File.ReadAllText("people.json");
// 轉換為對象
People people = JsonConvert.DeserializeObject<People>(jsonStr);
Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
}JSON 序列化特點
- 優(yōu)點:文本格式易讀、跨平臺(支持 Java、Python 等多語言)、第三方庫使用簡單;
- 缺點:相比二進制序列化,體積稍大、效率略低(但日常開發(fā)可忽略)。
四、三種序列化方式對比
| 序列化方式 | 核心工具類 | 可讀性 | 跨平臺性 | 易用性 | 適用場景 |
|---|---|---|---|---|---|
| 二進制序列化 | BinaryFormatter | 差(二進制) | 差(僅限.NET) | 中(需標記特性) | 本地高效存儲、.NET 內部通信 |
| JSON 原生序列化 | DataContractJsonSerializer | 好(文本) | 好 | 中(需標記特性) | 簡單跨平臺數據交換 |
| JSON 第三方序列化 | Newtonsoft.Json | 好(文本) | 好 | 優(yōu)(無需標記) | 多數場景(推薦),如接口通信、配置存儲 |
總結
原始文本保存因依賴順序,僅適用于極簡單場景;
二進制序列化適合.NET 內部高效存儲,不追求可讀性時使用;
JSON 序列化(尤其是Newtonsoft.Json)因易讀、跨平臺、易用,成為多數開發(fā)場景的首選。
到此這篇關于C#對象持久化的三種常用序列化方法總結的文章就介紹到這了,更多相關C#對象序列化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

