Coverage for aipyapp/aipy/event_serializer.py: 27%
67 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
4"""
5对象序列化器 - 统一处理事件中的对象序列化和反序列化
6"""
8from typing import Any, Dict, List, Union
11class EventSerializer:
12 """对象序列化器 - 处理事件数据中的对象序列化和反序列化"""
14 @staticmethod
15 def serialize(data: Any) -> Any:
16 """序列化数据中的对象
18 Args:
19 data: 待序列化的数据
21 Returns:
22 序列化后的数据
23 """
24 if isinstance(data, dict):
25 result = {}
26 for key, value in data.items():
27 result[key] = EventSerializer.serialize(value)
28 return result
29 elif isinstance(data, (list, tuple)):
30 return [EventSerializer.serialize(item) for item in data]
31 elif hasattr(data, 'to_dict'):
32 # 对象有 to_dict 方法,使用它进行序列化
33 return data.to_dict()
34 else:
35 # 基本类型直接返回
36 return data
38 @staticmethod
39 def deserialize(data: Any) -> Any:
40 """反序列化数据中的对象
42 Args:
43 data: 待反序列化的数据
45 Returns:
46 反序列化后的数据
47 """
48 if isinstance(data, dict):
49 # 检查是否是序列化的对象
50 if '__type__' in data:
51 return EventSerializer._reconstruct_object(data)
52 else:
53 # 递归处理字典
54 result = {}
55 for key, value in data.items():
56 result[key] = EventSerializer.deserialize(value)
57 return result
58 elif isinstance(data, list):
59 return [EventSerializer.deserialize(item) for item in data]
60 else:
61 # 基本类型直接返回
62 return data
64 @staticmethod
65 def _reconstruct_object(data: Dict[str, Any]) -> Any:
66 """根据类型信息重构对象
68 Args:
69 data: 包含类型信息的字典
71 Returns:
72 重构的对象,如果类型未知则返回原始数据
73 """
74 obj_type = data.get('__type__')
76 if obj_type == 'ChatMessage':
77 from ..llm.base import ChatMessage
78 return ChatMessage.from_dict(data)
79 elif obj_type == 'CodeBlock':
80 from .blocks import CodeBlock
81 return CodeBlock.from_dict(data)
82 else:
83 # 未知类型,返回原始数据
84 return data
86 @staticmethod
87 def serialize_event_data(event_data: Dict[str, Any]) -> Dict[str, Any]:
88 """序列化事件数据
90 Args:
91 event_data: 事件数据字典
93 Returns:
94 序列化后的事件数据
95 """
96 if not isinstance(event_data, dict):
97 return event_data
99 return EventSerializer.serialize(event_data.copy())
101 @staticmethod
102 def deserialize_event_data(event_data: Dict[str, Any]) -> Dict[str, Any]:
103 """反序列化事件数据
105 Args:
106 event_data: 序列化的事件数据字典
108 Returns:
109 反序列化后的事件数据
110 """
111 if not isinstance(event_data, dict):
112 return event_data
114 return EventSerializer.deserialize(event_data.copy())
116 @staticmethod
117 def serialize_events(events: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
118 """序列化事件列表
120 Args:
121 events: 事件列表
123 Returns:
124 序列化后的事件列表
125 """
126 serialized_events = []
127 for event in events:
128 serialized_event = event.copy()
129 if 'data' in serialized_event:
130 serialized_event['data'] = EventSerializer.serialize_event_data(serialized_event['data'])
131 serialized_events.append(serialized_event)
132 return serialized_events
134 @staticmethod
135 def deserialize_events(events: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
136 """反序列化事件列表(用于重放)
138 Args:
139 events: 序列化的事件列表
141 Returns:
142 反序列化后的事件列表
143 """
144 deserialized_events = []
145 for event in events:
146 deserialized_event = event.copy()
147 if 'data' in deserialized_event:
148 deserialized_event['data'] = EventSerializer.deserialize_event_data(deserialized_event['data'])
149 deserialized_events.append(deserialized_event)
150 return deserialized_events
152 @staticmethod
153 def register_serializable_type(type_name: str, from_dict_func: callable):
154 """注册新的可序列化类型
156 Args:
157 type_name: 类型名称(与 __type__ 字段对应)
158 from_dict_func: 从字典重构对象的函数
159 """
160 # 这里可以扩展为动态注册机制
161 # 目前硬编码在 _reconstruct_object 中
162 pass