fastjson 通过序列化反序列化实现深拷贝,无需实现 cloneable 接口,只需两行代码即可完成对象或泛型集合的复制,但要求字段可访问、避免不可序列化类型,并注意 fastjson1.x 安全风险及注解匹配问题。

Java 中的 Object.clone() 默认是浅拷贝,且需要类实现 Cloneable 接口并重写 clone() 方法,使用繁琐且易出错。而通过 Fastjson 序列化反序列化来实现“深拷贝”,是一种简单、通用、无需修改原类的快捷方式。
为什么用 Fastjson 实现 clone
Fastjson 将对象转成 JSON 字符串再解析回对象,天然绕过引用关系,能自动完成深拷贝(前提是对象可被正常序列化)。相比手动实现 clone() 或使用其他序列化框架(如 Kryo、Jackson),Fastjson 语法简洁、集成成本低,适合快速原型或内部工具场景。
基本实现方式
只需两行代码:先用 JSON.toJSONString() 序列化,再用 JSON.parseObject() 反序列化为目标类型:
- 确保目标类所有字段可被 Fastjson 访问(public 字段或有 public getter/setter)
- 若含泛型集合(如
List<user></user>),需传入TypeReference避免类型擦除 - 不支持含不可序列化字段(如
Thread、Socket、Lambda 表达式等)的对象
常见写法示例
普通 POJO 拷贝:
User original = new User("Alice", 25);
User copy = JSON.parseObject(JSON.toJSONString(original), User.class);
带泛型的集合拷贝:
List<user> list = Arrays.asList(new User("A", 20), new User("B", 22));
List<user> copyList = JSON.parseObject(JSON.toJSONString(list),
new TypeReference<list>>() {});</list></user></user>
注意事项和限制
Fastjson 的 clone 是“序列化语义”的深拷贝,并非严格等价于 clone() 合约(比如不调用构造函数、忽略 transient 字段、不处理循环引用时可能栈溢出)。另外:
- Fastjson 1.x 版本存在安全风险,生产环境建议升级到 Fastjson2(
com.alibaba.fastjson2) - 反序列化时若字段名与 JSON 键不匹配(如用了
@JSONField(name="user_name")),需确保注解生效 - 枚举、日期、BigDecimal 等类型默认支持,但自定义序列化器需额外配置
不复杂但容易忽略细节,用对了就是一行的事。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











