| """持久化: 状态保存/加载 (JSON 快照)""" |
| import json |
| import os |
| import numpy as np |
|
|
|
|
| def _serialize(obj): |
| """递归序列化 (处理 numpy 类型)""" |
| if isinstance(obj, np.ndarray): |
| return {"__ndarray__": True, "shape": list(obj.shape), |
| "dtype": str(obj.dtype), "data": obj.tobytes().hex()} |
| if isinstance(obj, np.generic): |
| return obj.item() |
| if isinstance(obj, dict): |
| return {str(k): _serialize(v) for k, v in obj.items()} |
| if isinstance(obj, (list, tuple)): |
| return [_serialize(v) for v in obj] |
| if hasattr(obj, "__dict__"): |
| return _serialize(obj.__dict__) |
| return obj |
|
|
|
|
| def _deserialize(obj): |
| """递归反序列化""" |
| if isinstance(obj, dict): |
| if obj.get("__ndarray__"): |
| arr = np.frombuffer(bytes.fromhex(obj["data"]), dtype=obj["dtype"]) |
| return arr.reshape(obj["shape"]) |
| return {k: _deserialize(v) for k, v in obj.items()} |
| if isinstance(obj, list): |
| return [_deserialize(v) for v in obj] |
| return obj |
|
|
|
|
| class StateStore: |
| """JSON 快照存储: 保存引擎状态到文件, 可恢复""" |
|
|
| def __init__(self, path: str): |
| self.path = path |
|
|
| def save(self, state: dict): |
| os.makedirs(os.path.dirname(self.path) or ".", exist_ok=True) |
| with open(self.path, "w") as f: |
| json.dump(_serialize(state), f, ensure_ascii=False) |
|
|
| def load(self) -> dict: |
| if not os.path.exists(self.path): |
| return {} |
| with open(self.path) as f: |
| return _deserialize(json.load(f)) |
|
|
| def exists(self) -> bool: |
| return os.path.exists(self.path) |
|
|