面向对象--序列化与反序列化


序列化与反序列化
概述
序列化是将对象转换为可以存储或传输的形式的过程。反序列化则是将这些形式重新转换回对象的过程。
常见序列化方式
Java原生态序列化
Java原态序列化是Java语言自带的序列化机制,通过实现Serializable
接口即可进行序列化。
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// Getters and Setters
}
Hessian序列化
Hessian是另一种高效的二进制序列化格式,支持跨语言反序列化。
public class User {
private String name;
private int age;
// Getters and Setters
}
HessianOutput ho = new HessianOutput(new ByteArrayOutputStream());
ho.writeObject(user);
byte[] bytes = ho.getByteBuffer();
JSON序列化
JSON是一种轻量级的数据交换格式,广泛用于Web应用中。
public class User {
private String name;
private int age;
// Getters and Setters
}
Gson gson = new Gson();
String json = gson.toJson(user);
安全性考虑
防范反序列化漏洞
在Java工程中,常见的反序列化漏洞包括Apache Commons Collections、Jackson、fastjson等库中的漏洞。为了防范这些攻击,可以采取以下措施:
- 避免序列化敏感信息:使用
transient
关键字修饰不需要序列化的变量。 - 权限控制:对传入数据进行校验或权限控制。
- 及时更新安全漏洞:保持使用的库和工具是最新版本,以修复已知的安全漏洞。
示例代码
使用transient
关键字
public class User {
private String name;
private transient int age; // 不会被序列化
// Getters and Setters
}
权限控制示例
if (hasPermission(user)) {
// 允许反序列化
} else {
throw new SecurityException("No permission to deserialize");
}
private boolean hasPermission(User user) {
// 检查用户是否有权限
return true;
}
通过以上措施,可以有效防范反序列化漏洞,确保系统的安全性。