最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#對象持久化的三種常用序列化方法總結(jié)

 更新時間:2025年08月19日 10:01:05   作者:張謹(jǐn)?shù)W  
這篇文章主要為大家介紹了C#中對象持久化的三種常用序列化方式,主要是針對內(nèi)存對象無法持久保存的問題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、對象本地保存的基本問題

對象在程序運行時存儲在內(nèi)存中,程序關(guān)閉后會被垃圾回收機制銷毀,無法保留狀態(tài)。若需在程序再次運行時恢復(fù)對象狀態(tài),需將對象信息持久化到磁盤(如文件)中。

原始保存方式的局限

直接將對象屬性按順序?qū)懭胛谋疚募ㄈ?code>People.obj),通過順序讀取還原對象,存在明顯缺點:

  • 強依賴順序:存儲與讀取順序必須完全一致,否則數(shù)據(jù)錯亂;
  • 可讀性差:無法直觀區(qū)分文件中各字段對應(yīng)對象的哪個屬性;
  • 擴展性差:對象新增屬性時,需修改存儲和讀取的全部邏輯。

二、序列化與反序列化

為解決原始保存方式的問題,引入 “序列化” 和 “反序列化” 機制:

  • 序列化:將對象狀態(tài)轉(zhuǎn)換為可存儲(如文件)或可傳輸(如網(wǎng)絡(luò))的格式(二進(jìn)制、XML、JSON 等)的過程。
  • 反序列化:將序列化后的格式(如二進(jìn)制流、JSON 文本)還原為對象的過程。

三、三種常用序列化方式

1. 二進(jìn)制序列化

將對象轉(zhuǎn)換為二進(jìn)制流,效率高、體積小,但可讀性差(二進(jìn)制無法直接看懂)。

核心組件

BinaryFormatter:位于System.Runtime.Serialization.Formatters.Binary命名空間,負(fù)責(zé)二進(jìn)制序列化與反序列化。

使用步驟

  1. 標(biāo)記類為可序列化:在類定義前添加[Serializable]特性(否則序列化失?。?;
  2. 創(chuàng)建文件流:通過FileStream指定存儲路徑和模式(如FileMode.Create創(chuàng)建文件);
  3. 實例化序列化器:創(chuàng)建BinaryFormatter對象;
  4. 執(zhí)行序列化 / 反序列化:調(diào)用Serialize()(寫入對象)或Deserialize()(讀取對象);
  5. 釋放資源:關(guān)閉文件流。

示例代碼

// 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();
        // 反序列化并轉(zhuǎn)換為People類型
        People people = bf.Deserialize(fs) as People;
        Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
    }
}

特點

  • 優(yōu)點:效率高(二進(jìn)制傳輸快)、體積??;
  • 缺點:不可讀(無法直接查看文件內(nèi)容)、僅限.NET 平臺(跨平臺兼容性差)。

2. JSON 序列化

JSON(JavaScript Object Notation)是一種輕量級文本格式,易讀易寫,跨平臺兼容性強(支持多語言),是目前最常用的序列化格式之一。

JSON 格式示例:

{ "Name":"吳凡", "Age":18, "Sex":"男", "Birth":"2005-01-01" }

方式 1:原生DataContractJsonSerializer

依賴System.Runtime.Serialization.Json命名空間,需手動標(biāo)記類和屬性。

使用步驟

  1. 標(biāo)記類和屬性:類添加[DataContract],需序列化的屬性添加[DataMember];
  2. 創(chuàng)建文件流:指定 JSON 文件路徑;
  3. 實例化序列化器DataContractJsonSerializer需指定對象類型(如typeof(People));
  4. 序列化 / 反序列化:調(diào)用WriteObject()(序列化)或ReadObject()(反序列化)。

示例代碼

// 1. 定義數(shù)據(jù)契約類
using System.Runtime.Serialization;
?
[DataContract]  // 標(biāo)記為數(shù)據(jù)契約類
public class People
{
    [DataMember]  // 標(biāo)記為需序列化的成員
    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并轉(zhuǎn)換為對象
        Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
    }
}

方式 2:第三方Newtonsoft.Json(推薦)

最流行的 JSON 處理庫,簡化序列化邏輯,無需標(biāo)記特性,支持復(fù)雜對象和集合。

使用步驟

  • 安裝庫:項目右鍵→“管理 NuGet 程序包”→搜索 “Newtonsoft.Json”→安裝;
  • 引入命名空間using Newtonsoft.Json;
  • 序列化:調(diào)用JsonConvert.SerializeObject(對象)生成 JSON 字符串,寫入文件;
  • 反序列化:讀取 JSON 字符串,調(diào)用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"
    };
?
    // 轉(zhuǎn)換對象為JSON字符串
    string jsonStr = JsonConvert.SerializeObject(people);
    // 寫入文件
    File.WriteAllText("people.json", jsonStr);
}
?
// 3. 反序列化
public void JsonDeserialize_Newtonsoft()
{
    // 讀取JSON字符串
    string jsonStr = File.ReadAllText("people.json");
    // 轉(zhuǎn)換為對象
    People people = JsonConvert.DeserializeObject<People>(jsonStr);
    Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");
}

JSON 序列化特點

  • 優(yōu)點:文本格式易讀、跨平臺(支持 Java、Python 等多語言)、第三方庫使用簡單;
  • 缺點:相比二進(jìn)制序列化,體積稍大、效率略低(但日常開發(fā)可忽略)。

四、三種序列化方式對比

序列化方式核心工具類可讀性跨平臺性易用性適用場景
二進(jìn)制序列化BinaryFormatter差(二進(jìn)制)差(僅限.NET)中(需標(biāo)記特性)本地高效存儲、.NET 內(nèi)部通信
JSON 原生序列化DataContractJsonSerializer好(文本)中(需標(biāo)記特性)簡單跨平臺數(shù)據(jù)交換
JSON 第三方序列化Newtonsoft.Json好(文本)優(yōu)(無需標(biāo)記)多數(shù)場景(推薦),如接口通信、配置存儲

總結(jié)

原始文本保存因依賴順序,僅適用于極簡單場景;

二進(jìn)制序列化適合.NET 內(nèi)部高效存儲,不追求可讀性時使用;

JSON 序列化(尤其是Newtonsoft.Json)因易讀、跨平臺、易用,成為多數(shù)開發(fā)場景的首選。

到此這篇關(guān)于C#對象持久化的三種常用序列化方法總結(jié)的文章就介紹到這了,更多相關(guān)C#對象序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#之HttpClient設(shè)置cookies的兩種方式

    C#之HttpClient設(shè)置cookies的兩種方式

    這篇文章主要介紹了C#之HttpClient設(shè)置cookies的兩種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 基于C#檢測敏感詞功能

    基于C#檢測敏感詞功能

    這篇文章主要為大家詳細(xì)介紹了如何基于C#實現(xiàn)檢測敏感詞功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C#實現(xiàn)HTML和UBB互相轉(zhuǎn)換的方法

    C#實現(xiàn)HTML和UBB互相轉(zhuǎn)換的方法

    這篇文章主要介紹了C#實現(xiàn)HTML和UBB互相轉(zhuǎn)換的方法,通過兩個自定義函數(shù)DoHtmlToUB與ubbtohtml來實現(xiàn)HTML代碼與ubb代碼間的相互轉(zhuǎn)換,是非常實用的技巧,需要的朋友可以參考下
    2014-11-11
  • Unity Shader實現(xiàn)玻璃材質(zhì)效果

    Unity Shader實現(xiàn)玻璃材質(zhì)效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)玻璃材質(zhì)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#簡單爬蟲案例分享

    C#簡單爬蟲案例分享

    這篇文章主要為大家分享了C#簡單爬蟲案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#中委托、事件和回調(diào)的使用及說明

    C#中委托、事件和回調(diào)的使用及說明

    這篇文章主要介紹了C#中委托、事件和回調(diào)的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C#書寫規(guī)范

    C#書寫規(guī)范

    C#書寫規(guī)范...
    2007-03-03
  • BarCode條形碼基于C# GDI+ 的實現(xiàn)方法詳解

    BarCode條形碼基于C# GDI+ 的實現(xiàn)方法詳解

    本篇文章介紹了,BarCode條形碼基于C# GDI+ 的實現(xiàn)方法詳解。需要的朋友參考下
    2013-05-05
  • C#實現(xiàn)winform漸變效果的方法

    C#實現(xiàn)winform漸變效果的方法

    這篇文章主要介紹了C#實現(xiàn)winform漸變效果的方法,涉及到窗體的設(shè)計與屬性的修改等技巧,需要的朋友可以參考下
    2014-10-10
  • C# LINQ的基本使用方法示例

    C# LINQ的基本使用方法示例

    這篇文章主要給大家介紹了關(guān)于C# LINQ的基本使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C# LINQ具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

恭城| 长沙县| 托里县| 清新县| 新乡市| 广德县| 宜川县| 石门县| 平湖市| 东乌珠穆沁旗| 花莲市| 吉林市| 临清市| 莆田市| 邵武市| 盐津县| 安岳县| 阿荣旗| 罗甸县| 怀柔区| 敦化市| 特克斯县| 阿瓦提县| 武乡县| 扬中市| 延寿县| 德庆县| 乡宁县| 连州市| 乐亭县| 阿拉善左旗| 新竹市| 佛教| 武川县| 乐山市| 自治县| 凤凰县| 永宁县| 定陶县| 沙洋县| 呼图壁县|