一、基于JVM默认序列化的对象传输
1.1 核心实现与代码示例
通过 Client.java 和 Server.java实现Java原生序列化通信:
// Client发送序列化对象
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(request); // 发送Message对象
// Server接收并反序列化
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
Message request = (Message) ois.readObject();
1.2 关键点说明
• 序列化接口:Message类需实现 Serializable 接口 。
• 字节流传输:JVM将对象转化为二进制字节流,适合高性能Java间通信。
• 应用场景:微服务框架(如Dubbo)、分布式缓存等纯Java环境。
二、serialVersionUID的作用与版本控制
2.1 显式声明的重要性
在 Message.java 和 User.java 中显式定义:
private static final long serialVersionUID = 1L;
2.2 核心作用
• 版本一致性校验:反序列化时比对类的serialVersionUID,防止类结构变更导致InvalidClassException。
• 避免隐式生成问题:未显式声明时,JVM根据类结构哈希生成UID,类字段变更会破坏兼容性。
2.3 应用场景
• 长期存储对象:如缓存持久化。
• 分布式系统升级:确保服务端与客户端类版本一致。
三、transient关键字与敏感字段保护
3.1 使用示例
User.java 中标记password为transient:
private transient String password; // 不被序列化
3.2 功能解析
• 字段排除:序列化时忽略敏感或冗余数据。
• 自定义初始化:通过readObject方法手动恢复 :
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
password = "default"; // 初始化transient字段
}
3.3 应用场景
• 安全敏感数据:如密码、密钥。
• 运行时计算字段:如缓存计算结果。
四、基于Gson的跨语言通信实现
4.1 跨语言通信原理
• 通用数据格式:使用JSON代替Java二进制流 JavaServer接收字符串)。
• Gson序列化:将对象转为JSON字符串,Python可通过json库解析。
4.2 代码实现
// Java客户端发送JSON
Gson gson = new Gson();
String json = gson.toJson(request);
writer.println(json);
// Python服务端解析
import json
data = json.loads(received_str)
4.3 应用场景
• 异构系统交互:如Java后台与Python数据分析服务通信。
• HTTP API设计:JSON作为通用数据格式。
五、序列化字节流与通用数据结构
5.1 核心差异对比
| 类型 | 特点 | 适用场景 |
|---|---|---|
| JVM序列化 | Java专属二进制格式 | 同语言高性能通信 |
| JSON/XML | 文本通用格式 | 跨语言平台交互 |
5.2 示例说明
• Java专属问题:Client.java 发送的字节流无法被Python解析。
• 通用方案:如JavaServer`接收字符串,配合JSON实现跨语言。
代码链接
https://gitee.com/shen-binbin/serialization.git
其中python脚本地址:src/main/resources/script/gson.py
1148

被折叠的 条评论
为什么被折叠?



