支持自定义序列化方案的深拷贝需替换固定序列化环节,选用能表达结构、支持循环引用、可还原新实例的协议(如json+编解码器、protobuf、java writeobject/readobject、python __reduce__),封装泛型工具函数确保新建实例,并主动过滤资源字段,最后验证嵌套修改隔离性、id唯一性及循环引用完整性。

实现支持自定义序列化方案的深拷贝,核心是把“序列化→传输/存储→反序列化”这一链路中原本固定的环节(如 Java 的 ObjectOutputStream 或 Python 的 pickle)替换成你可控的协议,同时保证语义完整、对象独立、类型不丢失。
明确你要替换哪一层序列化
不是所有“序列化”都适合做深拷贝底层。关键看它是否:能完整表达对象结构(含嵌套、引用关系)、支持循环引用、可还原为新实例、不依赖运行时状态(如文件句柄、锁)。常见可替换方案包括:
-
JSON + 自定义编解码器:轻量、跨语言,但只支持基本类型和字典/列表;需手动处理日期、枚举、自定义类(通过
default和object_hook) - Protocol Buffers / FlatBuffers:高性能二进制,需提前定义 schema;适合固定结构、高频拷贝场景
-
Java 的自定义
writeObject/readObject:在实现Serializable的类中重写这两个私有方法,控制字段如何序列化/重建 -
Python 的
__reduce__或__getstate__/__setstate__:决定实例如何被 pickle 序列化,可跳过不可拷贝字段或替换为工厂函数
封装成通用深拷贝工具方法
不要每次复制都重复写序列化逻辑。封装一个接受“序列化器+反序列化器”的泛型函数:
- Java 示例:传入
Function<object byte></object>和Function<byte object></byte>,内部完成流式转换 - Python 示例:定义
def deep_clone(obj, dumps_func, loads_func),调用dumps_func(obj)得 bytes,再用loads_func还原 - 关键点:确保
loads_func总是新建实例(不能复用缓存或单例),否则不是深拷贝
处理自定义类中的特殊字段
即使用了自定义序列化,仍需主动干预资源型字段(如数据库连接、线程本地变量、缓存引用)。不能靠序列化自动跳过——它可能直接报错或静默丢数据:
- 在序列化前过滤掉不该持久化的字段(如
transient在 Java 中的作用) - 对必须保留逻辑的字段(如配置 ID、唯一标识),序列化时只存 ID,反序列化时按需重建关联对象
- Python 中重写
__getstate__返回干净字典,__setstate__中重新初始化资源字段
验证是否真正深拷贝
自定义方案容易误以为“序列化了就是深的”。务必验证:
- 修改拷贝后对象的嵌套可变字段(如
copy.data_list.append(99)),原对象对应字段不变 - 检查对象 ID:
id(copy) != id(original),且所有嵌套对象的id都不重合 - 存在循环引用时(A→B→A),反序列化后仍保持相同引用结构,而非抛错或断开











