序列化和反序列化

目录

序列化和反序列化的定义

可序列化的广义和狭义

为什么要进行序列化

对象经过序列化后可在网络间传输的数据类型(常见)

如果有些字段不想进行序列化怎么办


序列化和反序列化的定义
  • 序列化(Serialization):将对象状态或数据结构转换成一种格式(如JSON, XML, 字节流等)以便在网络中传输或保存到文件中。
  • 反序列化(Deserialization):它是将序列化过的数据格式(如JSON, XML, 字节流等)转换回原来的对象状态或数据结构。

可序列化的广义和狭义
  • 狭义的可序列化:在狭义的情况下,可序列化通常指的是实现 java.io.Serializable 接口的类,这使得对象可以通过 Java 的序列化机制将其转换为字节流,以便在网络上传输、保存到文件或在内存中进行持久化。这种序列化是 Java 标准库提供的机制,通过实现 Serializable 接口,类的实例可以被序列化和反序列化。
  • 广义的可序列化:在广义的情况下,可序列化可以指将对象转换为任何一种数据格式,比如 JSON、XML、Protocol Buffers 等而不仅限于字节流。

实际应用中,对象的序列化可以根据需求选择合适的数据格式。例如,将对象转换为 JSON 格式可以方便地在 Web 应用中进行数据交换,而将对象转换为 XML 格式则可以与其他系统进行数据交换。

因此,虽然在技术上所有在网络上传输的数据都经过了一种“序列化”过程,但这并不意味着所有对象都必须实现Java的Serializable接口或等价的序列化机制。关键在于数据能够被转换为一种适合网络传输的格式,并且接收方能够将其恢复或解析为有用的形式。

为什么要进行序列化
  1. 数据持久化:序列化允许将对象的状态保存到存储设备(如硬盘)上,以便将来可以重新创建对象。这对于应用程序的数据保存和恢复非常重要。
  2. 网络通信:在网络上传输数据时,数据需要以一种线性的方式进行传输。序列化可以将对象转换为适合网络传输的格式(如JSON, XML, 字节流),使得不同的系统或应用程序能够交换数据。
  3. 分布式计算:在分布式系统中,对象可能需要在不同的机器或应用间共享或传递。序列化使得这些对象可以在网络上移动,支持远程过程调用(RPC)和对象远程共享。
  4. 数据交换:序列化提供了一种标准化的方法来表示复杂的数据结构,使得不同的程序语言和平台之间可以交换数据。
  5. 缓存数据:序列化允许将对象状态转换为一种格式,以便可以缓存到内存或文件系统中,提高数据访问的速度。

总之,序列化是数据处理中的一个关键步骤,它支持数据的持久化、交换和在不同环境间的无缝传输。

对象经过序列化后可在网络间传输的数据类型(常见)

对象经过序列化后,可以转换成多种类型以便在网络间传输。这些类型主要取决于序列化的格式和协议。常见的序列化后的数据类型包括:

字节流(Byte Stream):

  • 最基本的序列化形式,适用于Java原生序列化(通过java.io.Serializable接口),将对象转换为字节序列。

  • 适用于任何需要紧凑、二进制形式传输数据的场景。

文本格式(Text Format):

  • JSON (JavaScript Object Notation):轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。广泛用于Web服务和APIs。
  • XML (eXtensible Markup Language):一种标记语言,可自定义标签,数据描述性强,但比JSON更繁琐,解析速度较慢。
  • YAML (YAML Ain't Markup Language):一种侧重于数据可读性的序列化格式,常用于配置文件。

特定协议格式:

  • Protocol Buffers (Protobuf):由Google开发的一种语言无关、平台无关、可扩展的序列化结构数据的方法,比XML更小、更快、更简单。
  • Apache Thrift:由Facebook开发,支持多种编程语言,用于定义和创建服务的一套跨语言的序列化和RPC(远程过程调用)框架。
  • Avro:由Apache软件基金会开发的数据序列化系统,支持丰富的数据结构类型,常用于数据密集型应用如Hadoop。

其他格式:

  • MessagePack:一种高效的二进制序列化格式,允许你在多种语言之间交换数据。它类似于JSON但更小更快。
  • CBOR (Concise Binary Object Representation):一种类似于JSON的二进制格式,但更小更快。

每种类型都有其特定的应用场景和优缺点。选择哪种类型主要取决于应用的需求、数据的复杂性、以及对性能的要求。

如果有些字段不想进行序列化怎么办

针对 Java 对象的序列化,如果不想进行序列化的变量,可以使用transient关键字修饰。

Java 对象的序列化是指将对象转换为字节流,以便在网络上传输、保存到文件或在内存中进行持久化。这是通过 Java 的标准序列化机制实现的,通常是通过实现 java.io.Serializable 接口来实现的。 

扩展1:

serialVersionUID有什么用

序列化号serialVersionUID属于版本控制的作用。

在进行序列化时,会把当前类的serialVersionUID写入到字节序列(序列化的文件中)。

反序列化时,会检查serialVersionUID是否和当前类的serialVersionUID一致,如果serialVersionUID不一致则会抛出InvalidCastException异常。

强烈推荐每个序列化类都手动指定其serialVersionUID,如果不手动指定,那么编译器会动态生成默认的serialVersionUID。

serialVersionUID被static修饰为什么还会序列化

Java 中,静态变量是属于类级别的,而不是实例级别的。通常情况下,静态变量不会被包含在对象的序列化数据中,因为它们不属于对象的状态。

然而,serialVersionUID 是一个例外。它是用于在序列化和反序列化过程中进行版本控制的,以确保序列化和反序列化的对象版本一致。因此,尽管它是静态的,但在序列化过程中会被特殊处理,以确保它的值被包含在序列化的数据中。

这种特殊处理是由 Java 序列化机制内部实现的,它确保 serialVersionUID 在序列化和反序列化过程中能够正确地起到版本控制的作用。因此,即使 serialVersionUID 是静态的,它仍然会被序列化和反序列化机制考虑在内。

针对 JSON 格式的序列化,如果不想进行序列化的变量,可以使用@JsonIgnore。

JSON 格式的序列化是指将对象转换为 JSON 格式的字符串,以便在 Web 应用中进行数据交换、存储或传输。这是通过 JSON 库(如 Jackson、Gson 等)来实现的,通常是通过对象到 JSON 字符串的映射来实现的。

JAVA对象的序列化和JSON格式的序列区别在于:

Java 对象的序列化是将对象转换为字节流,通常用于在 Java 程序中进行对象的持久化和传输。


JSON 格式的序列化是将对象转换为 JSON 格式的字符串,通常用于在 Web 应用中进行数据交换和传输。

虽然它们都是将对象转换为另一种格式,但它们的应用场景和数据格式是不同的。 Java 对象的序列化是 Java 标准库提供的机制,而 JSON 格式的序列化是通过第三方库来实现的,用于在 Web 应用中进行数据交换。

扩展2:

在 Spring Boot 中,返回给前端的 List 对象通常会被自动转换为 JSON 格式的字符串。这个自动转换是通过 Spring Boot 内置的 Jackson JSON 库来实现的。

当控制器方法返回一个 List 对象时,Spring Boot 会使用 Jackson 库将这个 List 对象自动转换为 JSON 格式的字符串,并将这个 JSON 字符串作为 HTTP 响应的一部分发送给前端。这种自动转换是 Spring Boot 的默认行为,它简化了将数据对象转换为 JSON 格式的过程,使得开发人员可以更方便地将数据发送给前端。

举例来说,假设有一个控制器方法返回一个 List 对象:

@RestController
public class MyController {
    @GetMapping("/data")
    public List<MyData> getData() {
        List<MyData> dataList = // 获取数据的逻辑
        return dataList;
    }
}

在这个例子中,dataList 是一个 List 对象,当这个方法被调用时,Spring Boot 会自动使用 Jackson 库将 dataList 转换为 JSON 格式的字符串,并将这个 JSON 字符串作为 HTTP 响应的一部分返回给前端。

这种自动转换是 Spring Boot 的默认行为,它简化了将数据对象转换为 JSON 格式的过程,使得开发人员可以更方便地将数据发送给前端。

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值