跳到主要内容
版本:0.14

自定义序列化器

为特殊类型实现自定义序列化逻辑。

实现自定义序列化器

为 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))

相关主题