Java序列化与反序列化

  • 序列化

序列化时间对象转换为字节流的过程。这样对象就可以通过网络传输、持久化存储或者缓存。Java 提供了 java.io.Serializable 接口来指出序列化。只要实现了该接口,就可以将类的对象进行序列化。

  • 反序列化

反序列化是将字节流重新转换为对象的过程,即从存储中读取数据并重新创建对象。

通俗理解就是:序列化就是将"立体"的对象转换成可传输的字节序列格式,便于存储和传输。对象在JVM中可以认为其是"立体"存在的,会有各种引用,比如在内存地址 Ox123 引用了某对象,那此时这个对象要传输到网络的另一端的时候就需要把这些引用"压扁"。因为在网络另一端的内存地址 Ox123 中可能没有该对象,所以传输的对象需要包含这些信息,然后接收端需要将这些扁平的信息再反序列化成为"立体"对象。

序列化与反序列化通常在网络传输、远程调用、持久化存储以及分布式系统中用于数据交换。 一个类只有实现了 Serializable 接口才能被序列化。如果在序列化过程中有些字段不需要被序列化,比如某些敏感数据,则可以使用 transient 关键字标记这些不需要被序列化的字段。

每个 Serializable 类都应该定义一个 serialVersionUID,用于在反序列化时验证版本一致性。如果没有明确指定,Java 会根据类的定义自动生成哟个 UID,版本不匹配可能导致反序列化失败。反序列化是一个潜在的安全风险,因为通过恶意构造的字节流,可能会加载不安全的类或执行不期望的代码。因此,反序列化过程需要进行输入验证,避免反序列化漏洞。

相关推荐
我不会起名字3225 天前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
kingx36 天前
BugKu PRA 渗透测试 2(Harry‘s Blog):9 Flag 全链实战复盘
中间件·渗透测试·log4j2·内网渗透·反序列化
十五年专注C++开发7 天前
FlatBuffers: 一个高效的零拷贝二进制序列化库
c++·序列化·反序列化·flatbuffers
程序员大阳10 天前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
j7~12 天前
【ProtoBuf】(篇一)初识 ProtoBuf
运维·服务器·序列化·protobuf·protobuf的适用特点
骑着蜗牛撵大象32719 天前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv
换元不配限19 天前
Android 接入 protobuf 实战:从 Gradle 配置到避开 R8 混淆坑
android·grpc·序列化·protobuf·protocolbuffers·二进制序列化·.proto
AIgorithmGEEK1 个月前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Eason_LYC1 个月前
一个公开密钥放倒一片:Apache Shiro RememberMe 反序列化漏洞
java·网络安全·渗透测试·shiro·漏洞复现·反序列化·ai安全
其实防守也摸鱼1 个月前
Fastjson 反序列化漏洞(JNDI注入)
android·数据库·安全·oracle·自动化·fastjson·反序列化