Java对象序列化为字节数组需用ObjectOutputStream配合ByteArrayOutputStream,类须实现Serializable接口并建议声明serialVersionUID;反序列化则用ObjectInputStream与ByteArrayInputStream,要求类定义一致且注意安全风险。

Java 中将对象序列化为字节数组,核心是使用 ObjectOutputStream 配合 ByteArrayOutputStream,把对象写入内存字节数组中,便于网络传输或持久化。
确保类可序列化
被序列化的类必须实现 java.io.Serializable 接口(空接口,仅作标记):
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// getter/setter 省略
}
建议显式声明 serialVersionUID,避免因类结构变动导致反序列化失败。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
序列化为字节数组(Object → byte[])
用 ByteArrayOutputStream 捕获输出流数据,再通过 ObjectOutputStream 写入对象:
public static byte[] serialize(Object obj) throws IOException {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(obj);
return baos.toByteArray();
}
}
- 必须在 try-with-resources 或手动调用
close(),确保缓冲区刷新完成 - 若对象含不可序列化字段(如某些 IO 资源、线程),需用
transient修饰跳过,否则抛NotSerializableException
反序列化还原对象(byte[] → Object)
传输后接收方用 ByteArrayInputStream 和 ObjectInputStream 还原:
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais)) {
return ois.readObject();
}
}
- 反序列化时类定义必须与序列化时一致(包名、类名、serialVersionUID),否则报
InvalidClassException - 注意安全风险:不信任的字节流反序列化可能触发恶意代码,生产环境慎用或配合白名单校验
替代方案与注意事项
标准 Java 序列化体积大、性能一般、跨语言能力差。实际项目中常考虑:
- 用 JSON(如 Jackson / Gson)代替:更轻量、可读、跨平台,适合 Web API 传输
- 用 Protobuf / Kryo / FST:二进制协议,体积小、速度快,适合高性能内部通信
- 敏感字段(密码、token)不要序列化,或用
transient+ 自定义writeObject/readObject控制过程

















