一、Java序列化核心机制
1. 基础实现
public class User implements Serializable {// 必须显式声明serialVersionUIDprivate static final long serialVersionUID = 1L;private String username;private transient String password; // 瞬时字段不序列化private LocalDateTime registerTime;// 自定义序列化逻辑private void writeObject(ObjectOutputStream oos) throws IOException {oos.defaultWriteObject();oos.writeObject(registerTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));}private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {ois.defaultReadObject();String timeStr = (String) ois.readObject();registerTime = LocalDateTime.parse(timeStr);}
}
2. 底层原理剖析
-
对象图遍历:深度优先遍历对象引用
-
元数据存储:类描述信息占序列化数据的40%-60%
-
递归机制:处理嵌套对象时可能引发栈溢出
二、七大核心进阶特性
1. 版本控制策略
// 修改类结构时需谨慎处理版本号
private static final long serialVersionUID = 2L; // 版本升级
2. 自定义序列化方法
private void writeReplace() throws ObjectStreamException {// 替换实际序列化的对象return new ProxyUser(this);
}
3. 敏感字段保护
private transient SensitiveData sensitiveData; // 瞬时字段
private volatile String securityToken; // 易失字段
三、性能优化方案对比
1. 主流序列化方案对比
方案 | 序列化大小 | 速度 | 跨语言 | 可读性 |
---|---|---|---|---|
Java原生 | 100% | 基准 | 否 | 差 |
JSON(Gson) | 180% | 慢3倍 | 是 | 优 |
Protobuf | 30% | 快5倍 | 是 | 差 |
Kryo | 40% | 快10倍 | 否 | 差 |
2. 性能优化实践
// 使用Protobuf示例
syntax = "proto3";
message ProtoUser {string username = 1;int64 register_timestamp = 2;
}// 对象转换
ProtoUser protoUser = ProtoUser.newBuilder().setUsername(user.getUsername()).setRegisterTimestamp(registerTime.toEpochSecond()).build();
四、安全防护体系
1. 反序列化漏洞原理
// 危险示例:攻击链构造
public class Exploit implements Serializable {private void readObject(ObjectInputStream in) {Runtime.getRuntime().exec("rm -rf /");}
}
2. 防护策略
、
// 安全反序列化配置
ObjectInputStream ois = new ObjectInputStream(inputStream) {@Overrideprotected Class<?> resolveClass(ObjectStreamClass desc)throws IOException, ClassNotFoundException {if (!desc.getName().startsWith("com.safe")) {throw new InvalidClassException("Unauthorized class");}return super.resolveClass(desc);}
};