Thanks to visit codestin.com
Credit goes to fory.apache.org

Skip to main content
Version: dev

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