Custom Serializers
Implement custom serialization logic for specialized types.
Implementing Custom Serializers
Override write/read for Python mode, xwrite/xread for cross-language:
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):
# Custom serialization logic
buffer.write_varint32(obj.f1)
buffer.write_string(obj.f2)
def read(self, buffer):
# Custom deserialization logic
f1 = buffer.read_varint32()
f2 = buffer.read_string()
return Foo(f1, f2)
# For cross-language mode
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))
# Now Foo uses your custom serializer
data = f.dumps(Foo(42, "hello"))
result = f.loads(data)
print(result) # Foo(f1=42, f2='hello')
Buffer API
Write Methods
# Integers
buffer.write_int8(value)
buffer.write_int16(value)
buffer.write_int32(value)
buffer.write_int64(value)
# Variable-length integers
buffer.write_varint32(value)
buffer.write_varint64(value)
# Floating point
buffer.write_float32(value)
buffer.write_float64(value)
# Strings and bytes
buffer.write_string(value)
buffer.write_bytes(value)
# Boolean
buffer.write_bool(value)
Read Methods
# Integers
value = buffer.read_int8()
value = buffer.read_int16()
value = buffer.read_int32()
value = buffer.read_int64()
# Variable-length integers
value = buffer.read_varint32()
value = buffer.read_varint64()
# Floating point
value = buffer.read_float32()
value = buffer.read_float64()
# Strings and bytes
value = buffer.read_string()
value = buffer.read_bytes(length)
# Boolean
value = buffer.read_bool()
When to Use Custom Serializers
- External types from other packages
- Types with special serialization requirements
- Legacy data format compatibility
- Performance-critical custom encoding
- Types that don't work well with automatic serialization
Registering Custom Serializers
fory = pyfory.Fory()
# Register with type_id
fory.register(MyClass, type_id=100, serializer=MySerializer(fory, MyClass))
# Register with typename (for xlang)
fory.register(MyClass, typename="com.example.MyClass", serializer=MySerializer(fory, MyClass))
Related Topics
- Type Registration - Registration patterns
- Configuration - Fory parameters
- Cross-Language - xwrite/xread for xlang