Java序列化是JVM内置的对象状态快照与重建机制,保存非静态、非transient成员变量值及类元数据;需实现Serializable接口,嵌套对象也须可序列化,反序列化需类文件在classpath中。

Java序列化机制,本质是把内存中的对象“翻译”成一串可存储、可传输的字节流;反序列化则是把这串字节流再“还原”回原来的对象。它不是格式转换工具,而是JVM内置的一套对象状态快照与重建机制。
序列化到底在保存什么
它保存的是对象的实例状态:所有非静态、非transient的成员变量值,连同类的元数据(类名、字段名与类型、继承关系等)一起打包。静态变量、方法、构造器、transient字段都不会进入字节流。比如一个User对象有name、age和private static final String VERSION = "1.0",序列化后只含name和age的实际值,以及描述它们属于哪个类、是什么类型的信息。
实现序列化的硬性条件
- 目标类必须实现
java.io.Serializable接口(空标记接口,无方法) - 所有被引用的嵌套对象,也需可序列化(否则抛
NotSerializableException) - 反序列化端的classpath中必须存在该类的
.class文件,否则报ClassNotFoundException - 建议显式声明
private static final long serialVersionUID,避免因编译器自动生成差异导致反序列化失败
序列化过程怎么触发
靠ObjectOutputStream写入,核心就一句:out.writeObject(obj)。JVM自动递归处理对象图:遇到普通字段直接写值;遇到引用类型字段,若其实现了Serializable,就继续调用writeObject——直到整棵树都被展开为字节。整个过程无需手动编码,但开发者要对字段可见性、继承链、transient语义有清晰判断。
常见用途和关键限制
- 用于RMI参数/返回值、HTTP Session对象持久化、Redis缓存Java对象
- 不能跨语言:生成的字节流是Java专属格式,Python或Go无法直接解析
- 父类未实现
Serializable时,其字段在反序列化后由父类无参构造器初始化(可能为默认值) - 敏感字段(如密码)可用
transient跳过,或配合writeObject/readObject自定义加密逻辑










