【Java基础】常用序列化技术与方式

简介: 【Java基础】常用序列化技术与方式

序列化是相对比较重要也比较简单,但也比较容易被忽视的一类基础性知识。序列化在网络应用特别是如今的分布式系统中被大量使用,理解好序列化是理解好网络应用以及分布式系统架构的基础。

在面试中也会被经常问到,所以这个部分的内容还是需要掌握的。

一、序列化与反序列化

序列化:就是把对象转化为可传输的字节的过程。 反序列化:就是把可传输的字节还原成对象的过程。

序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组。

总结:序列化和反序列化本质上就是一个数据转换的过程。

二、序列化技术方案

常见的序列化技术实现方案有很多种,这里列举出了以下几种:JDK原生序列化、Json序列化、ProtoBuf序列化、Hessian序列化、Kryo序列化

三、序列化技术选型要点

在选择应用哪种序列化技术时,可以参考以下基本的考量点,通常是:

  1. 性能:需要考虑性能需求,序列化的速度和性能越高越好。
  2. 安全性:对于安全性的需要考量。JDK序列化可能有卡死线程的漏洞。
  3. 占用空间大小:序列化的结果所占用的空间大小,序列化后的字节数据通常会持久化到硬盘(占用存储资源)或者在网络上传输给其他服务器(占用带宽资源),这个指标当然是越小越好。
  4. 跨语言:企业内部系统是否有跨语言通信的需求。
  5. 可维护性:技术流行程序,越流行的技术可维护性就越高,维护成本会越低。

所谓跨语言就是你用Java编写的进程,数据序列化之后能够在别的如Python、PHP、C#等语言编写的进程内反序列化,就是所谓的跨语言

四、JDK原生序列化

Java类通过实现Serializable接口来实现该类对象的序列化。

比较经典的、不被看好的序列化技术,JDK自带的序列化技术。

开发者可以实现 java.io.Serializable 接口。然后用 java.io.ObjectOutputStream 类实现序列化,以及 java.io.ObjectInputStream 类实现反序列化。

JDK自带的序列化技术,有很多缺点所以是 不被推荐使用的。就比如性能问题、序列化后的数据很占用空间、以及严重的反序列化安全漏洞。(可参考《Effective Java Third Edition》书中《12. Serialization Item 85: Prefer alternatives to Java Serialization》)

五、Json序列化

当下最流行的序列化方式无非是 JSON 了,而且 JSON 作为前后端交互使用最广泛的格式。作为最通用的格式,各种语言都支持,并且可以支持复杂的对象。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON 序列化就是将数据对象转换为 JSON 字符串。在序列化过程中抛弃了类型信息,所以反序列化时只有提供类型信息才能准确地反序列化。JSON 可读性比较好,方便调试。

常见的JSON序列化框架有:fastJSON、Jackson、Gson等。

六、ProtoBuf序列化

谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统。

但是要使用Protobuf会相对来说麻烦一些,因为他有自己的语法,有自己的编译器,如果需要用到的话必须要去投入成本在这个技术的学习中。

Protobuf有个缺点就是传输的每一个类的结构都要生成相对应的proto文件,如果某个类发生修改,还要重新生成该类对应的proto文件。

七、Hessian序列化

Hessian 是一个轻量级的二进制 web service 协议,主要用于传输二进制数据。

在传输数据前 Hessian 支持将对象序列化成二进制流,相对于 JDK 原生序列化,Hessian序列化之后体积更小,性能更优。

八、Kryo序列化

Kryo是一个开源的高性能的Java序列化/反序列化的库。Kryo库的效率很高且作为序列化结果的byte[]占用空间也较小,因此在诸多顶级项目里都有被使用。

Kryo 是一个 Java 序列化框架,号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势,底层依赖于字节码生成机制。

由于只能限定在 JVM 语言上,所以 Kryo 不支持跨语言使用。

完结!


相关文章
|
3月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
450 44
|
3月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
445 1
|
4月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
172 4
|
4月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
981 1
|
5月前
|
人工智能 Java
Java多任务编排技术
JDK 5引入Future接口实现异步任务处理,但获取结果不够灵活。Java 8新增CompletableFuture,实现异步任务编排,支持流式处理、多任务组合及异常处理,提升执行效率与代码可读性,简化并发编程复杂度。
142 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
201 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
226 1
|
4月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
793 4
|
3月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
311 0
|
4月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
274 3