【C# 序列化】开端
定义
序列化是使用指定格式将活动对象或对象图转换为字节序列的过程,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保
存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。
对象图objectGfraph, 一个对象可以引用一个集合,而这个集合引用了一组对象,这些对象可以继续引用其他对象 ,这就形成了对象图。调用格式化器的Serialize方法时,对象图中的所有对象都被序列化到流中。
格式化器算法会确保每个对象只序列化一次。避免相互引用造成的死循环。
可以指定的格式有几十种,但最常见的两种格式是可扩展标记语言(XML)和JavaScript对象表示法(JSON)。
更优方案:JSON更紧凑,最适合Web和移动应用程序。 XML较为冗长,但在更多旧系统中得到更好的支持。 使用JSON可以最小化序列化对象图的大小。 将对象图发送到Web应用程序和移动应用程序时,JSON也是一个不错的选择,因为JSON是JavaScript的本机序列化格式,并且移动应用程序通常会在有限的带宽上进行调用,因此字节数很重要。
.NET Core具有多个类,这些类将在XML和JSON之间进行序列化。 我们将从查看XmlSerializer和JsonSerializer开始。
类型以及命名空间
system [serializeable]、[Noserializeable]
System.Runtime.serialization命名空间提供了:
[OnDeserialized]、[OnDeserializing]、[OnSerialized]、[OnSerializing]
[OptionalFiled]:指定序列化流中可能缺少某个字段,以便BinaryFormatter和SoapFormatter不会抛出异常。应用到新版本类型的新增加的字段上,当序列化格式化器看到该特性的应用与一个字段时,就不会因为流中的数据不包含这个字段而抛出异常。
序列化的工作原理
序列化的用途 JSON 序列化 二进制和 XML 序列化 序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保 存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。 下图展示了序列化的整个过程: 将对象序列化为带有数据的流。 该流还可能包含有关对象类型的信息,例如其版本、区域性和程序集名称。 可以 将此流中的对象存储在数据库、文件或内存中。
xue'lie'h
序列化的用途
通过序列化,开发人员可以保存活动对象的状态,并能在需要时重新创建对象,同时还能存储对象和交换数据。 通过 序列化,开发人员可以执行如下操作: 使用 Web 服务将对象发送到远程应用程序 将对象从一个域传递到另一个域 将对象通过防火墙传递为 JSON 或 XML 字符串 跨应用程序维护安全或用户特定的信息
可序列化的类型
引用类型、struct、枚举、委托。枚举和委托是一定可以序列化的所有不用[serializeable]标记
Object、List<T>、HashTable、数组
继承性
[serializeable] 不会遗传到子类,如果子类标记为[serializeable],那么基类也必须标记[serializeable]。因为子类保护了父类。
公开性
序列化会将所有的数据都保存成二进制,包含阔private、readonly等。因此敏感的数据例如账号密码等字段应该设置成不可序列化[Noserializeable]。
序列化控制
可以使用:[Noserializeable]、[Noserializeable]、[OptionalField]、[OnDeserializing]、[OnSerialized]、[OnSerializing]特性对序列化进行部分控制。
.....................
本章更多内容请查阅:https://www.cnblogs.com/cdaniu/p/15965892.html
序列化器
序列化必须要使用到序列化器,它用于完成将数据转化为特定格式的数据。以下列举3种格式化器:
System.Runtime.Serialization.Formatters.Soap.SoapFormatter 已经建议使用。
以SOAP的格式对对象进行序列化和反序列化操作,从.NET
Framework2.0开始,该类就废弃。
System.Runtime.Serialization.NetDataContractSerializer 用.NET Framework提供的类型,将类型实例序列化和返序列化为XML流或文档结构。
System.Runtime.Serialization.DataContractSerializer 使用指定的数据协定,将类型实例序列化和反序列化XML流或文档结构
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 以二进制的格式对对象进行序列化和反序列操作。(本地 .net6.0 开始已经过时)
System.Xml.Serialization.XmlSerializer 将类型的实例序列化和反序列化XML文档,该类允许控制如何将对象编码为XML文档。(网络传输)
System.Text.Json.Serialization:Json已经成主流,是.net core 内置。System.Text.Json
中不支持 System.Runtime.Serialization 命名空间中的特性(网络传输)。
实现Json序列/反序列化的技术有两种:反射(默认)和原生成器。 作为替代方法,.net6.0 可以使用 C# 源生成功能来提高性能、减少专用内存使用量并促进程序集修整,从而减小应用大小和加快启动速度。如果想知道 反射或源生成 的区别请点击查看
反序列化插件
JSON转C#实体类:
1、一、首先进行Json格式化校验 http://www.bejson.com/ (推荐这个在线工具非常好用)
收录于 2021-09-13 16:44:19 查看 708 次 前言: 这段时间一直在做一个第三方平台的对接,对接第三方其实无非就是请求调用第三方的相关接口接收返回过来的相关参数。因此在这个过程中就会涉及大量的JSON响应参数或者请求参数转化为对应的实体类的情况,因为只有转化为对应的实体类我们才好进行相关的数据操作。那么问题来了,这样我们在遇到后很多JSON对象的情况下是不是要自己一个一个的去写对应类的属性那假如有二三十个那岂不是要疯了去,其实咱们强大的Visual Studio有一个强大的功能能够将JSON串自动转化为对应的类(真的是一个提高工作效率的好方法)。 一、首先进行Json格式化校验 http://www.bejson.com/ (推荐这个在线工具非常好用) { "metaData": { "defaultLang": "zh-CN", "name": "追逐时光者每日一秀", "categoryIds": ["214342106997653504", "214343889333583872"], "tagIds": ["215586040843403264", "212828639341903872"], "residentAGApp": "101144753", "sourceName": "追逐时光者出版社", "sellingMode": 2, "remarks": "你是最棒的", "availableFrom": "2019-01-01T08:00:00Z", "availableBefore": "2020-01-01T10:00:00Z", "autoStatusChange": [{ "status": 0, "changeTime": "string" }], "eduappUsed": true, "eduappPurchased": true, "devProductId": "1001", "distNotifyUrl": "https://www.cnblogs.com/Can-daydayup/", "validityUnit": 5, "validityNum": 1, "includeLessons": true, "typeId": 1001, "teachers": ["212828639341903872"], "mediaType": 3, "needDelivery": true }, "countryCodes": ["CN", "SG"] }
2、复制JSON串, Visual Studio 编辑=》选择性粘贴=》将JSON粘贴为类:
注意:首先根据自己的需求创建一个对应实体空白类
Json序列化(反射)
序列化行为
- 默认情况下,所有公共属性都会序列化。 可以指定要忽略的属性。
- 默认编码器会转义非 ASCII 字符、ASCII 范围内的 HTML 敏感字符以及根据 RFC 8259 JSON 规范必须进行转义的字符。
- 默认情况下,JSON 会缩小。 可以对 JSON 进行格式化输出。
- 默认情况下,JSON 名称的大小写与 .NET 名称匹配。 可以自定义 JSON 名称大小写。
- 默认情况下,检测到循环引用并引发异常。 可以保留引用并处理循环引用。
- 默认情况下忽略字段。 可以包含字段。
当你在 ASP.NET Core 应用中间接使用 System.Text.Json 时,某些默认行为会有所不同。 有关详细信息,请参阅 JsonSerializerOptions 的 Web 默认值。
支持的类型包括:
- 映射到 JavaScript 基元的 .NET 基元,如数值类型、字符串和布尔。
- 用户定义的普通旧 CLR 对象 (POCO)。
- 一维和交错数组 (
T[][]
)。 - 以下命名空间中的集合和字典。
有关详细信息,请参阅 中支持的集合类型。
可以实现自定义转换器以处理其他类型或提供内置转换器不支持的功能。
反序列化行为
对 JSON 进行反序列化时,以下行为适用:
- 默认情况下,属性名称匹配区分大小写。 可以指定不区分大小写。
- 如果 JSON 包含只读属性的值,则会忽略该值,并且不引发异常。
- 序列化程序会忽略非公共构造函数。
- 支持反序列化为不可变对象或不具有公共
set
访问器的属性。 请参阅不可变类型和记录。 - 默认情况下,支持将枚举作为数字。 可以将枚举名称序列化为字符串。
- 默认情况下忽略字段。 可以包含字段。
- 默认情况下,JSON 中的注释或尾随逗号会引发异常。 可以允许注释和尾随逗号。
- 默认最大深度为 64。
当你在 ASP.NET Core 应用中间接使用 System.Text.Json 时,某些默认行为会有所不同。 有关详细信息,请参阅 JsonSerializerOptions 的 Web 默认值。
可以实现自定义转换器以提供内置转换器不支持的功能。
System.Text.Json.Serialization命名空间中,我们提供了一些用于高级场景和用户定制的属性和API,这些属性和API特定于JsonSerializer
的序列化和反序列化。其中使用最多的为JsonConverter<T>
类型,此类型允许用户控制序列化和反序列化特定的类型、属性、字段。
System.Text.Json命名空间中提供了以下核心类型:
- JsonSerializer: 提供将.NET对象序列化成JSON格式和将JSON反序列化成.NET对象的方法。
- JsonDocument: 提供随机访问的能力以检查JSON值的结构内容而不需自动化实例数据值。此类型是不可变的(immutable type)。
- JsonElement: 表示
JsonDocument
中的特定JSON值。 - Utf8JsonWriter: 提供高性能API,用于对UTF-8编码的JSON文本的仅前向,非缓存写入。
- Utf8JsonReader: 提供高性能API,用于对UTF-8编码的JSON文本进行仅转发的逐令牌处理。
System.Text.Json 命名空间包含所有入口点和主要类型。 System.Text.Json.Serialization 命名空间包含用于高级方案的特性和 API,以及特定于序列化和反序列化的自定义。
System.Text.Json 中支持的集合类型
.net 中有4种解析Json文档的方式:
- System.Text.Json命名空间中 有两种:(1)、JsonDocument (2)、Utf8JsonReader 。
- System.Text.Json.Node命名空间有一种 JsonNode,
- System.Text.Json.Serialization命名空间的Json序列化方式