java对象网络传输需先序列化为字节流,核心是实现serializable接口并用objectoutputstream写出、objectinputstream读入;但存在安全、兼容性问题,推荐json或protobuf等现代方案。

Java 对象要通过网络传输,必须先序列化为字节流;核心是实现 Serializable 接口并使用 ObjectOutputStream 写出,接收方用 ObjectInputStream 读入反序列化。但要注意安全、兼容性和替代方案。
对象必须可序列化
只有实现了 java.io.Serializable 接口的类,才能被默认序列化:
- 接口是空标记接口,不需实现方法,但 JVM 会据此启用序列化机制
- 建议显式声明 private static final long serialVersionUID = 1L;,避免因类结构变更导致反序列化失败
- 敏感字段(如密码)应加 transient 修饰,避免被序列化
用 ObjectOutputStream 发送字节流
将对象写入输出流(如 Socket 的 OutputStream),即可获得字节流:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建 ObjectOutputStream 包装底层输出流(注意:它会自动写入头部标识,不能与其他普通 write() 混用)
- 调用 writeObject(obj) 方法,对象及其引用的可序列化字段会被递归序列化
- 务必调用 flush() 和 close(),否则数据可能滞留缓冲区
用 ObjectInputStream 接收并还原对象
接收端需用匹配的输入流还原对象:
- 用 ObjectInputStream 包装 Socket 的 InputStream(顺序和类型必须与发送端严格一致)
- 调用 readObject(),返回 Object 类型,需强制转型为原类型
- 若类在接收端不存在或 serialVersionUID 不匹配,会抛出 ClassNotFoundException 或 InvalidClassException
更推荐的现代做法
原生 Java 序列化存在安全风险(如反序列化远程代码执行)、跨语言差、性能一般,生产环境建议:
- 用 JSON(如 Jackson / Gson)或 Protobuf 序列化为通用文本/二进制格式,再传输
- HTTP + REST API 是主流选择,对象转 JSON 字符串,通过 HTTP body 传输
- 若坚持二进制且高性能,可用 Kryo(需注册类,不依赖 Serializable)或 Protobuf(需定义 .proto 文件)
不复杂但容易忽略:序列化不是万能的,线程、Socket、数据库连接等资源类不可序列化,必须标记 transient 或自行处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










