Serializable

Serializable是 Java 中用于对象序列化的接口。序列化是将对象的状态转换为字节流的过程,以便存储或传输。反序列化则是将字节流恢复为对象的过程。

Serializable 接口没有任何方法或字段,仅用于标识一个类的对象是可序列化的,实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象(前提实现 Serializable 接口)。

复制代码
// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.ser"));
out.writeObject(user);
out.close();

// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.ser"));
User user = (User) in.readObject();
in.close();

什么时候需要实现呢?

序列化的场景就是当你需要保存对象,或者通过网络把对象传输到其他地方的时候,类必须实现 Serializable 才能将其对象序列化为字节流。

private static final long serialVersionUID = 1L;

serialVersionUID 是用于验证序列化和反序列化过程中类的一致性。JVM在反序列化时会比较传入字节流中的serialVersionUID与本地类的serialVersionUID,如果一致则认为是兼容的,可以进行反序列化,否则会抛出 InvalidClassException 异常。

定义 private static final long serialVersionUID = 1L; 可以确保类在版本变化时的兼容性,避免反序列化时出现版本不一致的错误。显式定义serialVersionUID是一个良好的编程实践,特别是在需要频繁序列化和反序列化的场景中。

相关推荐
wuminyu1 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++
蜗牛互联网1 小时前
Python Agent 工具调用:审批令牌、参数白名单和累计预算
java·开发语言·人工智能·windows·后端·python
哦虎!1 小时前
【JavaEE】网络编程套接字
java
Wang's Blog1 小时前
Java 项目实战: 交友项目 - SpringCloud 整合 Dubbo 的方案概述
java·spring cloud·交友
imDwAaY2 小时前
程序里的地址是真实内存地址吗?从虚拟内存到地址转换
java·linux·服务器
秋饼2 小时前
Claude Haiku 5.5 + Spring AI 2.0 企业级低成本高并发 AI Agent 实战:子智能体分工、成本熔断与百万上下文落地
java·ai·技术分享·后端开发
xuxigifxfh2 小时前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
涉密IT资质笔记2 小时前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳2 小时前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法