Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

序列化为什么要实现 Serializable?所有序列化都需要吗?

查看完整题解

参考回答

直接回答

Java 原生对象序列化用 Serializable 标记类型参与相应协议,它是没有业务方法的标记接口。普通对象不满足原生协议要求,写入时可能抛 NotSerializableException。但 JSON 等其他序列化方案有各自规则,并不因此都要求实现 Serializable。

讲清原理

实现标记不等于整个对象图一定可写出。默认序列化会处理相应的非 static、非 transient 实例状态;其中引用的普通对象若不支持协议,也可能让操作失败。继承、自定义写读逻辑、枚举与 record 还有额外规则。

serialVersionUID 用于普通可序列化类的版本兼容检查,不保证任意修改都兼容。反序列化输入也可能触发复杂对象行为,应限制来源、类型和资源消耗,不能把可反序列化等同于安全。

例子与易错点

var bytes = new java.io.ByteArrayOutputStream();
try (var output = new java.io.ObjectOutputStream(bytes)) {
    output.writeObject("已知的演示文本");
}
try (var input = new java.io.ObjectInputStream(
        new java.io.ByteArrayInputStream(bytes.toByteArray()))) {
    System.out.println(input.readObject()); // 已知的演示文本
}

这里只读取本例自己生成的数据,String 已支持原生协议。普通 Serializable 类的构造恢复规则,不应笼统推广到 record、枚举或 Externalizable;不同格式也不能直接混着读。

相关题:第 41 题、第 49 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。