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>),需传入TypeReference避免类型擦除 - 不支持含不可序列化字段(如
Thread、Socket、Lambda 表达式等)的对象
常见写法示例
普通 POJO 拷贝:
使用固定的 Next.js/Tailwind/Prisma 技术栈构建并记录独立 SaaS 项目,仅将 FastAPI 用于 Python 工作负载,并遵循严格的架构规范。
立即学习“Java免费学习笔记(深入)”;
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<User>>() {});
注意事项和限制
Fastjson 的 clone 是“序列化语义”的深拷贝,并非严格等价于 clone() 合约(比如不调用构造函数、忽略 transient 字段、不处理循环引用时可能栈溢出)。另外:
- Fastjson 1.x 版本存在安全风险,生产环境建议升级到 Fastjson2(
com.alibaba.fastjson2) - 反序列化时若字段名与 JSON 键不匹配(如用了
@JSONField(name="user_name")),需确保注解生效 - 枚举、日期、BigDecimal 等类型默认支持,但自定义序列化器需额外配置
不复杂但容易忽略细节,用对了就是一行的事。

















