Java对象网络传输需先序列化为字节流,再反序列化还原;仅实现Serializable接口的类支持原生序列化,需声明serialVersionUID、用transient屏蔽敏感字段;推荐使用JSON、Protobuf或Kryo等更安全高效的替代方案。

Java对象要在网络中传输,必须先转成字节流——这个过程叫序列化;接收方再把字节流还原成对象,叫反序列化。核心是让对象“可被描述”,而不是直接传内存地址。
对象得先能被序列化
只有实现 java.io.Serializable 接口的类,才能走 Java 原生序列化流程:
- 接口本身是空的,不写方法,只起标记作用
- 强烈建议手动声明 private static final long serialVersionUID = 1L;,否则类一改字段(比如加个新属性),反序列化就容易失败
- 敏感字段(如密码、临时缓存)用 transient 修饰,它不会进字节流
- 注意:线程、Socket、数据库连接这类资源类不能序列化,要么标 transient,要么自己重写 writeObject/readObject 方法处理
发送端:把对象写成字节流再发出去
别直接往 Socket 的 OutputStream 里 writeObject,得套一层 ObjectOutputStream:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 ByteArrayOutputStream 或直接包装 Socket.getOutputStream() 创建 ObjectOutputStream
- 调用 writeObject(obj),它会递归序列化对象及其所有可序列化的成员
- 必须调用 flush() 和 close(),否则数据可能卡在缓冲区没发出去
- 不能混用普通 write() 和 writeObject(),ObjectOutputStream 自带协议头,乱写会破坏格式
接收端:按顺序读回来并还原
接收方用 ObjectInputStream 包装对应的 InputStream,操作要和发送端严格对齐:
立即学习“Java免费学习笔记(深入)”;
- 输入流来源必须和发送端输出流匹配(比如都是同一个 Socket 的流)
- 调用 readObject(),返回的是 Object 类型,需强制转型为原始类型(如 (Student) in.readObject())
- 如果类在接收端不存在,或 serialVersionUID 不一致,会抛出 ClassNotFoundException 或 InvalidClassException
- 反序列化时也会检查类结构,若字段类型或数量不兼容,同样失败
更稳妥的替代方案(推荐生产环境用)
Java 原生序列化有明显短板:不安全(反序列化漏洞可导致远程代码执行)、跨语言难、性能一般、升级兼容性差。实际项目中更常用:
- JSON + HTTP:用 Jackson 或 Gson 把对象转成字符串,走 REST API,简单、通用、调试方便
- Protobuf:定义 .proto 文件,生成代码,二进制体积小、速度快、天然支持多语言
- Kryo:高性能二进制序列化库,无需实现 Serializable,但要求类可访问无参构造器,适合内部 RPC
- 加密传输需求?在序列化后、发送前加 AES 加密层,解密后再反序列化,密钥管理必须严谨

















