Coverage for autocrud/serializer.py: 77%
57 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-23 23:00 +0800
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-23 23:00 +0800
1"""序列化器模組"""
3import json
4import pickle
5from typing import Any
6from abc import ABC, abstractmethod
8try:
9 import msgpack
11 HAS_MSGPACK = True
12except ImportError:
13 HAS_MSGPACK = False
16class Serializer(ABC):
17 """序列化器抽象基類"""
19 @abstractmethod
20 def serialize(self, data: Any) -> bytes:
21 """序列化數據"""
22 pass
24 @abstractmethod
25 def deserialize(self, data: bytes) -> Any:
26 """反序列化數據"""
27 pass
30class JsonSerializer(Serializer):
31 """JSON 序列化器"""
33 def serialize(self, data: Any) -> bytes:
34 return json.dumps(data, ensure_ascii=False).encode("utf-8")
36 def deserialize(self, data: bytes) -> Any:
37 return json.loads(data.decode("utf-8"))
40class PickleSerializer(Serializer):
41 """Pickle 序列化器"""
43 def serialize(self, data: Any) -> bytes:
44 return pickle.dumps(data)
46 def deserialize(self, data: bytes) -> Any:
47 return pickle.loads(data)
50class MsgPackSerializer(Serializer):
51 """MsgPack 序列化器"""
53 def __init__(self):
54 if not HAS_MSGPACK:
55 raise ImportError("需要安裝 msgpack: pip install msgpack")
57 def serialize(self, data: Any) -> bytes:
58 return msgpack.packb(data, use_bin_type=True)
60 def deserialize(self, data: bytes) -> Any:
61 return msgpack.unpackb(data, raw=False)
64class SerializerFactory:
65 """序列化器工廠"""
67 _serializers = {
68 "json": JsonSerializer,
69 "pickle": PickleSerializer,
70 "msgpack": MsgPackSerializer,
71 }
73 @classmethod
74 def create(cls, serializer_type: str) -> Serializer:
75 """創建序列化器實例"""
76 if serializer_type not in cls._serializers:
77 available = ", ".join(cls._serializers.keys())
78 raise ValueError(
79 f"不支援的序列化器類型: {serializer_type}. 可用類型: {available}"
80 )
82 serializer_class = cls._serializers[serializer_type]
83 return serializer_class()
85 @classmethod
86 def register(cls, name: str, serializer_class: type):
87 """註冊新的序列化器"""
88 cls._serializers[name] = serializer_class
90 @classmethod
91 def available_types(cls) -> list:
92 """獲取可用的序列化器類型"""
93 return list(cls._serializers.keys())
96# 使用範例
97if __name__ == "__main__":
98 # 測試 JSON 序列化器
99 json_serializer = SerializerFactory.create("json")
101 test_data = {"name": "Alice", "age": 30, "email": "alice@example.com"}
103 # 序列化
104 serialized = json_serializer.serialize(test_data)
105 print(f"序列化後: {serialized}")
107 # 反序列化
108 deserialized = json_serializer.deserialize(serialized)
109 print(f"反序列化後: {deserialized}")
111 # 顯示可用的序列化器
112 print(f"可用的序列化器: {SerializerFactory.available_types()}")