Python中双向链表如何序列化?如何编写通用双向链表JSON编码器
双向链表JSON序列化通用方案
双向链表序列化的核心障碍是prev/next带来的循环引用,最优方案是先将链表拍平为有序节点数组,再做序列化,反序列化时重新构建双向关联即可,这种方案结构简洁、性能损耗极低。
编写通用的双向链表编码器完全可行,核心逻辑是自动识别双向链表节点(判断是否同时存在prev、next属性),过滤关联字段后提取所有业务属性,不需要为每个节点类单独编写定制逻辑,实现代码如下:
from json import JSONEncoder class GenericLinkedNodeEncoder(JSONEncoder): def default(self, o): # 匹配双向链表节点的特征 if hasattr(o, "prev") and hasattr(o, "next"): # 过滤关联字段,提取所有业务属性 return { k: v for k, v in o.__dict__.items() if k not in ("prev", "next") } # 非节点类型走默认序列化逻辑 return super().default(o)
使用方法
序列化
先将双向链表转换为有序节点列表,再调用编码器即可:
import json # 工具方法:双向链表转有序列表 def linked_list_to_array(head): nodes = [] current = head while current: nodes.append(current) current = current.next return nodes # 调用示例,支持所有带prev/next的节点类 head = ... # 你的双向链表头节点 node_arr = linked_list_to_array(head) json_str = json.dumps(node_arr, cls=GenericLinkedNodeEncoder)
反序列化
反序列化后重新构建双向关联即可,同样是通用逻辑:
# 工具方法:属性列表转双向链表 def array_to_linked_list(attr_arr, node_cls): nodes = [node_cls(**attrs) for attrs in attr_arr] for e1, e2 in zip(nodes, nodes[1:]): e1.next = e2 e2.prev = e1 return nodes[0] if nodes else None # 调用示例 loaded_attr_arr = json.loads(json_str) loaded_head = array_to_linked_list(loaded_attr_arr, DataNode)
方案优势
- 完全通用,适配所有符合「带prev/next属性的纯数据节点」模式的类,不需要重复编写编码器
- 彻底避免循环引用问题,序列化后的JSON结构无冗余
- 序列化、反序列化逻辑轻量,额外性能开销可忽略
内容的提问来源于stack exchange,提问作者Mark Lumar
相关产品推荐
相关产品推荐

