当前位置: 首页 > 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

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

相关文章:

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

C#中序列化的选择&#xff1a;JSON、XML、二进制与Protobuf详解 在C#开发中&#xff0c;序列化是将对象转换为可存储或传输的格式的过程&#xff0c;而反序列化则是将存储或传输的数据重新转换为对象的过程。选择合适的序列化方式对应用程序的性能、可维护性和兼容性至关重要。…...

单片机实现模式转换

[任务] 要求通过单片机实现以下功能&#xff1a; 1.单片机有三种工作模式(定义全局变量MM表示模式&#xff0c;MM1&#xff0c;2&#xff0c;3表示三种不同的模式) LED控制模式 风扇控制模式 蜂鸣器控制模式 2.可以在某一个模式下通过拓展板KEY1按键控制设备 (按…...

Shader -> SweepGradient扫描渐变着色器详解

XML文件 <com.example.myapplication.MyViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_gravity"center"android:layout_height"400dp"/>自定义View代码 c…...

鼠标过滤驱动

文章目录 概述代码参考资料 概述 其编写过程大体与键盘过滤驱动相似&#xff0c;只需要切换一下附加的目标设备以及创建的设备类型等。但在该操作后依然无法捕获到Vmware创建的win7操作系统的鼠标irp信息&#xff0c;于是通过在获取鼠标驱动&#xff0c;遍历其所有的设备进而附…...

【深度学习】数据操作入门

数据操作 为了能够完成各种数据操作&#xff0c;我们需要某种方法来存储和操作数据。 通常&#xff0c;我们需要做两件重要的事&#xff1a;&#xff08;1&#xff09;获取数据&#xff1b;&#xff08;2&#xff09;将数据读入计算机后对其进行处理。 如果没有某种方法来存储…...

WIFIAP项目 5G RX二次谐波超标案例分析

一、 问题的现象及描述 采用博通WIFI方案方案的两个项目在做CE高频杂散测试时发现5G RX出现10.359 GHz的高频杂散点&#xff0c;通过更换信道&#xff0c;该杂散点跟着改变&#xff0c;最终确认该频率是5G主信号的二倍频&#xff1b;如下图&#xff1a; 二、 问题分析  由于…...

HarmonyOS(ArkUI框架介绍)

ArkUI框架介绍 ArkUI简介 基本概念 UI&#xff1a; 即用户界面。开发者可以将应用的用户界面设计为多个功能页面&#xff0c;每个页面进行单独的文件管理&#xff0c;并通过页面路由API完成页面间的调度管理如跳转、回退等操作&#xff0c;以实现应用内的功能解耦。 组件&…...

在 Ubuntu 下通过 Docker 部署 MySQL 服务器

引言 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其依赖打包成一个标准化的单元。MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;因其高性能、可靠性和易用性&#xff0c;成为许多应用的首选数据库。结合 Docker 和 MySQL&#xff0c;可以轻松地创…...

MCU 和 PSK

在加密和认证领域&#xff0c;MCU 和 PSK 是两个不同的概念&#xff0c;分别涉及硬件和密钥管理。下面是它们的含义和相关解释&#xff1a; 1. MCU 全称&#xff1a;Microcontroller Unit&#xff08;微控制单元&#xff09; 用途&#xff1a; MCU 是一种集成了 CPU、内存&am…...

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

目录 1. 查看进程 1.1 准备工作 1.2 指令&#xff1a;ps—显示当前系统中运行的进程信息 1.3 查看进程属性 1.4 通过 /proc 系统文件夹看进程 2. 父进程与子进程 2.1 介绍 2.2 getpid() \getppid() 2.3 fork()函数—通过系统调用创建进程 fork()函数疑问 3. 进程状态…...

苍穹外卖07——来单提醒和客户催单(涉及SpringTask、WebSocket协议、苍穹外卖跳过微信支付同时保证可以收到订单功能)

Spring Task介绍 应用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒火车票销售系统处理未付款订单入职纪念日为用户发送通知 cron表达式 cron表达式其实就是一个字符串&#xff0c;通过cron表达式可以定义任务触发的时间。 构成规则&#xff1a;分为6或7个域&…...

C语言二级考试

你必须知道的 二级考试不是编写程序&#xff0c;或者说不只是编程的考核&#xff0c;它还会考核计算机C语言相关语言还有内涵等基础知识&#xff0c;比较全面综合&#xff08;说人话&#xff0c;要看最新考纲具备一定的基础知识&#xff09; 考试时间 120 分钟 分值 100 分&…...

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因&#xff1a;Maven 构建时&#xff0c;Java 版本配置不匹配 我安装的JDK版本是1.8&#xff0c;但由于种种原因&#xff0c;Maven构建时指定了 Java 17 作为目标发行版&#xff0c;从而导致错误 解决方案 首先&#xff0c;java -version&#xff0c;查看环…...

javafx 将项目打包为 Windows 的可执行文件exe

要将 JavaFX 项目打包为 .exe 文件&#xff0c;你可以使用一些工具将你的应用程序封装为 Windows 可执行文件。以下是两种常用的方法&#xff1a; 方法 1&#xff1a;使用 jpackage&#xff08;适用于 JDK 14 及更高版本&#xff09; jpackage 是 JDK 内置的工具&#xff0c;…...

Python操作Excel的库openpyxl使用入门

openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。以下是一些 openpyxl 的基本使用方法&#xff1a; 安装 openpyxl 首先&#xff0c;确保已经安装了 openpyxl。如果没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; pip install openp…...

数据通过canal 同步es,存在延迟问题,解决方案

当使用 Canal 同步数据到 Elasticsearch&#xff08;ES&#xff09;时&#xff0c;出现延迟问题通常源于多个因素&#xff0c;如 Canal 配置、网络延迟、ES 的负载和性能瓶颈等。以下是一些解决方案&#xff0c;帮助减少和解决延迟问题&#xff1a; 1. 优化 Canal 配置 Canal…...

了解Node.js

Node.js是一个基于V8引擎的JavaScript运行时环境&#xff0c;它允许JavaScript代码在服务器端运行&#xff0c;从而实现后端开发。Node.js的出现&#xff0c;使得前端开发人员可以利用他们已经掌握的JavaScript技能&#xff0c;扩展技能树并成为全栈开发人员。本文将深入浅出地…...

Android Studio创建新项目并引入第三方jar、aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…...

Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库

Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;4&#xff09;&#xff1a;配置备库 目录 Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;4&#xff09;&#xff1a;配置备库一、为备库配置静态监听1、配置 li…...

前端炫酷动画--文字(二)

目录 一、弧形边框选项卡 二、零宽字符 三、目录滚动时自动高亮 四、高亮关键字 五、文字描边 六、按钮边框的旋转动画 七、视频文字特效 八、立体文字特效让文字立起来 九、文字连续光影特效 十、重复渐变的边框 十一、磨砂玻璃效果 十二、FLIP动画 一、弧形边框…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...