当前位置: 首页 > news >正文

C#中序列化的选择:JSON、XML、二进制与Protobuf详解

C#中序列化的选择:JSON、XML、二进制与Protobuf详解

在C#开发中,序列化是将对象转换为可存储或传输的格式的过程,而反序列化则是将存储或传输的数据重新转换为对象的过程。选择合适的序列化方式对应用程序的性能、可维护性和兼容性至关重要。本文将详细介绍C#中常见的序列化方式:JSONXML二进制Protobuf,并帮助你根据需求选择最合适的方案。


1. JSON 序列化

1.1 概述

  • JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。
  • 它广泛用于Web API、配置文件和数据存储。

1.2 使用场景

  • Web API 数据传输。
  • 配置文件存储。
  • 需要人类可读格式的场景。

1.3 实现方式

C#中可以使用 System.Text.JsonNewtonsoft.Json 库来实现 JSON 序列化。

使用 System.Text.Json(.NET Core 3.0+)
using System;
using System.Text.Json;public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){var person = new Person { Name = "Alice", Age = 30 };// 序列化string json = JsonSerializer.Serialize(person);Console.WriteLine("Serialized JSON: " + json);// 反序列化var deserializedPerson = JsonSerializer.Deserialize<Person>(json);Console.WriteLine($"Deserialized Person: {deserializedPerson.Name}, {deserializedPerson.Age}");}
}
使用 Newtonsoft.Json
using System;
using Newtonsoft.Json;public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){var person = new Person { Name = "Alice", Age = 30 };// 序列化string json = JsonConvert.SerializeObject(person);Console.WriteLine("Serialized JSON: " + json);// 反序列化var deserializedPerson = JsonConvert.DeserializeObject<Person>(json);Console.WriteLine($"Deserialized Person: {deserializedPerson.Name}, {deserializedPerson.Age}");}
}

优点

  • 轻量级,易于阅读和编写。
  • 广泛支持,跨平台兼容性好。

缺点

  • 数据冗余较多,文件体积较大。
  • 不支持复杂数据类型(如循环引用)。

2. XML 序列化

2.1 概述

  • XML(eXtensible Markup Language)是一种标记语言,具有严格的格式和结构。
  • 它广泛用于配置文件、数据存储和 Web 服务。

2.2 使用场景

  • 需要严格结构化的数据存储。
  • 配置文件存储。
  • 与旧系统兼容的场景。

2.3 实现方式

C#中可以使用 System.Xml.Serialization 来实现 XML 序列化。

using System;
using System.IO;
using System.Xml.Serialization;public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){var person = new Person { Name = "Alice", Age = 30 };// 序列化var serializer = new XmlSerializer(typeof(Person));using (var writer = new StringWriter()){serializer.Serialize(writer, person);string xml = writer.ToString();Console.WriteLine("Serialized XML: " + xml);}// 反序列化string xmlData = @"<Person><Name>Alice</Name><Age>30</Age></Person>";using (var reader = new StringReader(xmlData)){var deserializedPerson = (Person)serializer.Deserialize(reader);Console.WriteLine($"Deserialized Person: {deserializedPerson.Name}, {deserializedPerson.Age}");}}
}

优点

  • 结构化数据,易于验证和解析。
  • 支持复杂数据类型。

缺点

  • 数据冗余较多,文件体积较大。
  • 可读性较差,解析速度较慢。

3. 二进制序列化

3.1 概述

  • 二进制序列化将对象转换为二进制格式,适合高效存储和传输。
  • 它通常用于高性能场景或需要紧凑数据格式的场景。

3.2 使用场景

  • 高性能数据传输。
  • 紧凑数据存储。
  • 需要加密或压缩的场景。

3.3 实现方式

C#中可以使用 System.Runtime.Serialization.Formatters.Binary 来实现二进制序列化。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;[Serializable]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){var person = new Person { Name = "Alice", Age = 30 };// 序列化var formatter = new BinaryFormatter();using (var stream = new MemoryStream()){formatter.Serialize(stream, person);byte[] binaryData = stream.ToArray();Console.WriteLine("Serialized Binary Data: " + BitConverter.ToString(binaryData));}// 反序列化byte[] data = /* 从文件或网络获取二进制数据 */;using (var stream = new MemoryStream(data)){var deserializedPerson = (Person)formatter.Deserialize(stream);Console.WriteLine($"Deserialized Person: {deserializedPerson.Name}, {deserializedPerson.Age}");}}
}

优点

  • 数据紧凑,文件体积小。
  • 序列化和反序列化速度快。

缺点

  • 不可读,调试困难。
  • 跨平台兼容性差。

4. Protobuf 序列化

4.1 概述

  • Protobuf(Protocol Buffers)是 Google 开发的一种高效的数据交换格式。
  • 它比 JSON 和 XML 更紧凑,序列化和反序列化速度更快。

4.2 使用场景

  • 高性能数据传输(如微服务通信)。
  • 需要紧凑数据格式的场景。
  • 跨语言兼容的场景。

4.3 实现方式

C#中可以使用 Google.Protobuf 库来实现 Protobuf 序列化。

安装 NuGet 包
Install-Package Google.Protobuf
Install-Package Google.Protobuf.Tools
定义 Protobuf 消息格式
syntax = "proto3";
message Person {string name = 1;int32 age = 2;
}
使用 Protobuf 序列化
using System;
using Google.Protobuf;public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(){var person = new Person { Name = "Alice", Age = 30 };// 序列化var message = new PersonMessage { Name = person.Name, Age = person.Age };byte[] data = message.ToByteArray();Console.WriteLine("Serialized Protobuf Data: " + BitConverter.ToString(data));// 反序列化var deserializedMessage = PersonMessage.Parser.ParseFrom(data);Console.WriteLine($"Deserialized Person: {deserializedMessage.Name}, {deserializedMessage.Age}");}
}

优点

  • 数据紧凑,文件体积小。
  • 序列化和反序列化速度快。
  • 跨语言兼容性好。

缺点

  • 需要定义消息格式,开发成本较高。
  • 不可读,调试困难。

5. 总结

特性JSONXML二进制Protobuf
可读性
文件体积较大较大最小
性能最高
跨平台兼容性
适用场景Web API、配置文件配置文件、旧系统兼容高性能存储、传输高性能传输、跨语言通信
  • 如果需要人类可读的格式,选择 JSONXML
  • 如果需要高性能和紧凑的数据格式,选择 二进制Protobuf
  • 如果需要跨语言兼容性,选择 JSONProtobuf

根据你的具体需求选择合适的序列化方式,可以显著提升应用程序的性能和可维护性。如果你有更多问题或想法,欢迎在评论区留言!

http://www.lryc.cn/news/519263.html

相关文章:

  • 单片机实现模式转换
  • Shader -> SweepGradient扫描渐变着色器详解
  • 鼠标过滤驱动
  • 【深度学习】数据操作入门
  • WIFIAP项目 5G RX二次谐波超标案例分析
  • HarmonyOS(ArkUI框架介绍)
  • 在 Ubuntu 下通过 Docker 部署 MySQL 服务器
  • MCU 和 PSK
  • Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)
  • 苍穹外卖07——来单提醒和客户催单(涉及SpringTask、WebSocket协议、苍穹外卖跳过微信支付同时保证可以收到订单功能)
  • C语言二级考试
  • IDEA Maven构建时报错:无效的目标发行版17
  • javafx 将项目打包为 Windows 的可执行文件exe
  • Python操作Excel的库openpyxl使用入门
  • 数据通过canal 同步es,存在延迟问题,解决方案
  • 了解Node.js
  • Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡
  • Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库
  • 前端炫酷动画--文字(二)
  • ceph 数据均衡
  • 代码随想录算法训练营day29
  • android studio根据包名获取当前安装包信息
  • 学习第六十五行
  • 零碎的知识点(七):线性二次调节器(LQR)是什么?
  • Matlab一些使用技巧
  • Linux 发行版介绍与对比:Red Hat、Ubuntu、Kylin、Debian
  • 从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)
  • java1-相对路径与绝对路径
  • iChainfo 品牌升級為 ichaingo,打造 Web3 數據基礎設施新標杆
  • Flink概念知识讲解之:Restart重启策略配置