自定义序列化器
为特殊类型实现自定义序列化逻辑。
实现自定义序列化器
为 Python 模式覆盖 write/read,为跨语言模式覆盖 xwrite/xread:
import pyfory
from pyfory.serializer import Serializer
from dataclasses import dataclass
@dataclass
class Foo:
f1: int
f2: str
class FooSerializer(Serializer):
def __init__(self, fory, cls):
super().__init__(fory, cls)
def write(self, buffer, obj: Foo):
# 自定义序列化逻辑
buffer.write_varint32(obj.f1)
buffer.write_string(obj.f2)
def read(self, buffer):
# 自定义反序列化逻辑
f1 = buffer.read_varint32()
f2 = buffer.read_string()
return Foo(f1, f2)
# 用于跨语言模式
def xwrite(self, buffer, obj: Foo):
buffer.write_int32(obj.f1)
buffer.write_string(obj.f2)
def xread(self, buffer):
return Foo(buffer.read_int32(), buffer.read_string())
f = pyfory.Fory()
f.register(Foo, type_id=100, serializer=FooSerializer(f, Foo))
# 现在 Foo 使用自定义序列化器
data = f.dumps(Foo(42, "hello"))
result = f.loads(data)
print(result) # Foo(f1=42, f2='hello')
Buffer API
写入方法
# 整数
buffer.write_int8(value)
buffer.write_int16(value)
buffer.write_int32(value)
buffer.write_int64(value)
# 变长整数
buffer.write_varint32(value)
buffer.write_varint64(value)
# 浮点数
buffer.write_float32(value)
buffer.write_float64(value)
# 字符串和字节
buffer.write_string(value)
buffer.write_bytes(value)
# 布尔值
buffer.write_bool(value)
读取方法
# 整数
value = buffer.read_int8()
value = buffer.read_int16()
value = buffer.read_int32()
value = buffer.read_int64()
# 变长整数
value = buffer.read_varint32()
value = buffer.read_varint64()
# 浮点数
value = buffer.read_float32()
value = buffer.read_float64()
# 字符串和字节
value = buffer.read_string()
value = buffer.read_bytes(length)
# 布尔值
value = buffer.read_bool()
何时使用自定义序列化器
- 来自其他包的外部类型
- 具有特殊序列化需求的类型
- 旧数据格式兼容性
- 性能关键的自定义编码
- 自动序列化效果不好的类型
注册自定义序列化器
fory = pyfory.Fory()
# 使用 type_id 注册
fory.register(MyClass, type_id=100, serializer=MySerializer(fory, MyClass))
# 使用 typename 注册(用于 xlang)
fory.register(MyClass, typename="com.example.MyClass", serializer=MySerializer(fory, MyClass))