C# 序列化三种方式

序列化是啥?
就是把一个 C# 对象(比如 Person、Order)变成一串能存文件、能发网络的“字符串”或“字节”。
反序列化就是反过来,把这串东西变回对象。

为啥要干这事?

  • 存到文件(比如保存游戏进度)
  • 发给别的程序(比如 Web API 返回 JSON)
  • 缓存数据

C# 里最常用的三种方式:​XML、JSON(用 JsonConvert)、二进制​。下面全用真实文件读写来演示,不玩虚的!

本版专门用 JsonConvert(Newtonsoft.Json) 来做 JSON 序列化,因为很多人还在用它,而且 API 简单好记!


1. XML 序列化 —— 老派但稳定

✅ 适合场景:

  • 配置文件(比如 .config)
  • 老系统对接
  • 人类能看懂(带标签,结构清晰)

️ 怎么用?(直接读写文件!)

// 1. 定义类(必须有 public 无参构造函数!)
public class Person
{public string Name { get; set; }public int Age { get; set; }
}

➤ 序列化:对象 → 写入 XML 文件

var person = new Person { Name = "张三", Age = 25 };
var xmlSerializer = new XmlSerializer(typeof(Person));using (var writer = new StreamWriter("person.xml"))
{xmlSerializer.Serialize(writer, person);
}
Console.WriteLine("已保存到 person.xml");

➤ 反序列化:从 XML 文件 → 读回对象

var xmlSerializer = new XmlSerializer(typeof(Person));using (var reader = new StreamReader("person.xml"))
{var person = (Person)xmlSerializer.Deserialize(reader);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");
}

✅ 生成的 person.xml 能用记事本打开,清清楚楚!


2. JSON 序列化 —— 用 JsonConvert(超简单!)

✅ 为什么用 JsonConvert?

  • API 超简单:SerializeObject​ / DeserializeObject
  • 老项目标配,兼容性好
  • 功能强大(忽略 null、格式化、自定义转换等)

️ 前提:先装 NuGet 包!

  1. 在 Visual Studio:右键项目 → “管理 NuGet 程序包” → 搜索 Newtonsoft.Json → 安装
  2. 或命令行:
dotnet add package Newtonsoft.Json
  1. 代码顶部加:
using Newtonsoft.Json;

类还是那个类(不用改!)

public class Person
{public string Name { get; set; }public int Age { get; set; }
}

➤ 序列化:对象 → 写入 JSON 文件

var person = new Person { Name = "李四", Age = 30 };// 一行搞定序列化!
string json = JsonConvert.SerializeObject(person);// 写入文件
File.WriteAllText("person.json", json);
Console.WriteLine("已保存到 person.json");

➤ 反序列化:从 JSON 文件 → 读回对象

string json = File.ReadAllText("person.json");// 一行搞定反序列化!
var person = JsonConvert.DeserializeObject<Person>(json);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");

小技巧:让 JSON 更好看(带缩进)

string json = JsonConvert.SerializeObject(person, Formatting.Indented);
File.WriteAllText("person.json", json);

生成的 person.json 长这样:

{"Name": "李四","Age": 30
}

3. 二进制序列化 —— 快但“黑盒”(慎用!)

⚠️ 仅限 .NET Framework(如 4.8)!.NET Core / .NET 5+ 已废弃!

[Serializable]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}

➤ 序列化到文件

var person = new Person { Name = "王五", Age = 28 };
using (var stream = new FileStream("person.dat", FileMode.Create))
{var formatter = new BinaryFormatter();formatter.Serialize(stream, person);
}
Console.WriteLine("已保存到 person.dat(乱码文件)");

➤ 从文件反序列化

using (var stream = new FileStream("person.dat", FileMode.Open))
{var formatter = new BinaryFormatter();var person = (Person)formatter.Deserialize(stream);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");
}

再强调:新项目别用!有安全风险!


三种方式对比(文件实测)

方式 库/命名空间 序列化代码 反序列化代码
XML System.Xml.Serialization xmlSerializer.Serialize(writer, obj) (Person)xmlSerializer.Deserialize(reader)
JSON Newtonsoft.Json JsonConvert.SerializeObject(obj) JsonConvert.DeserializeObject<Person>(json)
二进制 System.Runtime.Serialization.Formatters.Binary formatter.Serialize(stream, obj) (Person)formatter.Deserialize(stream)

实际建议(说人话)

  1. 新项目 + 想省事? → 用 JsonConvert,API 简单,文档多,社区熟。
  2. 新项目 + 追求性能? → 用 .NET 自带的 System.Text.Json(但 API 稍复杂)。
  3. 老项目? → 大概率已经在用 JsonConvert,继续用没问题。
  4. XML? → 只在对接老系统或读 .config 时用。
  5. 二进制? → 忘了它吧,除非你在修 10 年前的代码。

最后一句话总结:

JsonConvert.SerializeObject 是最接地气的 JSON 序列化方式——一行代码搞定,文件看得见,改得了,传得动!
装个 NuGet 包,加个 using,剩下的交给它!

搞定!现在你的 person.json 就躺在项目目录里,随时能打开看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站标题一样高端品牌运动鞋

目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项…

织梦网站添加视频教程莱芜新闻电视台节目表

目录 1、divmod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 divmod函数在Python中具有广泛的应用场景&#xff0c;特别是在需要同时处理除法的商和余数的情况下。常见的应用场景有&a…

VMware+RockyLinux+ikuai+docker+cri-docker+k8s 自用 实践笔记(一) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

区别:Modbus RTU 和 Modbus TCP

区别:Modbus RTU 和 Modbus TCP Modbus RTU 常用函数,如下://打印数组数据 static void printArray(const QString& title, qint64 dataLen, const uint8_t* data) {QString strPrint;for (int i = 0; i < d…

记录安装机器/深度学习环境(conda、CUDA、pytorch)时的一些问题

1. 正确查看自己的CUDA版本CUDA分为两种,驱动API和运行API。 驱动API指的是显卡驱动支持的最高cuda版本,我们运行程序时用的是运行API。nvidia-smi显示的是驱动所能支持的最大运行API版本。 nvcc --version查看的是C…

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

5G车载市场新格局:国产崛起,从破局者到引领者的升维之战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python组合类型和组合可空类型

python组合类型和组合可空类型 漫思

深入解析:自动化接口框架搭建分享-pytest

深入解析:自动化接口框架搭建分享-pytestpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

手撕深度学习之CUDA并行规约算法(上篇):硬核揭秘200%性能提升的GPU优化之道,从硬件特性到算法实现的完整进阶指南

本文为CUDA并行规约系列文章的上篇,本系列将会介绍CUDA编程的一些基础软硬件知识,然后给出7种规约算法的实现,并从硬件的角度对它们进行分析和优化,最终给出一个开箱即用的模板代码。 本文主要介绍了CUDA编程的基础…

网络运营者中国seo第一人

1、ORACLE快速遍历树 2、join基表很大&#xff0c;性能问题 转载于:https://www.cnblogs.com/stevenlii/p/8631708.html

实战需求分析

需求获取的方法 1.制作调查问卷 2.单据分析(单据时客户填写的纸质单据) 3.报表分析(报表时客户对产品的反应的各种数据的整理) 如何分析报表:使用常识判断、听客户讲解、研习客户文档、研习电子表格公式

完整教程:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——高级特性与生产环境深度实践

完整教程:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——高级特性与生产环境深度实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

哪里可以做网站优化网站怎么做配置文件夹

首先我们需要下载ssh&#xff0c;因为我们没有安装 sshd 命令意思是开启ssh 下载完以后要设置密码&#xff0c;我设置得是 123456 开启服务&#xff0c;查看ip 电脑连接 ssh 刚刚得ip -p 8022 后面就连接上了 我可以在这里启动我手机上的vnc

广州网站建设 seo怎么用ps做网站上的产品图

概述 实现规范化、标准化的引导式设计&#xff0c;以业务需求为输入&#xff0c;识别业务特点&#xff0c;并通过引导式设计&#xff0c;找到最适合的设计模式、具体方案&#xff0c;汇总成为应用的设计&#xff0c;拉齐各应用的设计一的致性。 采用标准化的方式开展设计…

数学草稿

P13645 Totient with Divisors \[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\sigma(ij)&=\sum_{i=1}^n\sum_{j=1}^m\varphi(i)\varphi(j)\sum_{a|i}\sum_{b|j}\frac{ib}{a}\times[a\perp b]\\…

【RabbitMQ】主题(Topics)与主题交换机(Topic Exchange)

本章目标理解主题交换机(Topic Exchange)的强大路由能力。掌握通配符*和#的使用规则。学习基于模式匹配的复杂消息路由。实现一个支持多维度过滤的智能消息系统。一、理论部分 1. 主题交换机(Topic Exchange)简介 …

企业网站推广技巧有哪些怎样做免费网站推广

1.你说一下什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一…

详细介绍:八股已死、场景当立(微服务保护篇)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu上编译 Linux_RT 内核

目录一、编译安装1. 下载 Linux 内核源码和对应版本的 preempt_rt 补丁源码2. 解压及安装依赖项2.1 安装依赖2.2 解压缩文件并打补丁3. 自定义部分编译配置3.1 生成相关的内核配置文件3.2 修改调整内核的一些配置项4. …