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

Skip to main content
Version: dev

Cross-Language Serialization

pyfory supports cross-language object graph serialization, allowing you to serialize data in Python and deserialize it in Java, Go, Rust, or other supported languages.

Enable Cross-Language Mode

To use xlang mode, create Fory with xlang=True:

import pyfory
fory = pyfory.Fory(xlang=True, ref=False, strict=True)

Cross-Language Example

Python (Serializer)

import pyfory
from dataclasses import dataclass

# Cross-language mode for interoperability
f = pyfory.Fory(xlang=True, ref=True)

# Register type for cross-language compatibility
@dataclass
class Person:
name: str
age: pyfory.int32

f.register(Person, typename="example.Person")

person = Person("Charlie", 35)
binary_data = f.serialize(person)
# binary_data can now be sent to Java, Go, etc.

Java (Deserializer)

import org.apache.fory.*;

public class Person {
public String name;
public int age;
}

Fory fory = Fory.builder()
.withLanguage(Language.XLANG)
.withRefTracking(true)
.build();

fory.register(Person.class, "example.Person");
Person person = (Person) fory.deserialize(binaryData);

Rust (Deserializer)

use fory::Fory;
use fory::ForyObject;

#[derive(ForyObject)]
struct Person {
name: String,
age: i32,
}

let mut fory = Fory::default()
.compatible(true)
.xlang(true);

fory.register_by_namespace::<Person>("example", "Person");
let person: Person = fory.deserialize(&binary_data)?;

Type Annotations for Cross-Language

Use pyfory type annotations for explicit cross-language type mapping:

from dataclasses import dataclass
import pyfory

@dataclass
class TypedData:
int_value: pyfory.int32 # 32-bit integer
long_value: pyfory.int64 # 64-bit integer
float_value: pyfory.float32 # 32-bit float
double_value: pyfory.float64 # 64-bit float

Type Mapping

PythonJavaRustGo
strStringStringstring
intlongi64int64
pyfory.int32inti32int32
pyfory.int64longi64int64
floatdoublef64float64
pyfory.float32floatf32float32
listListVec[]T
dictMapHashMapmap[K]V

Differences from Python Native Mode

The binary protocol and API are similar to pyfory's python-native mode, but Python-native mode can serialize any Python object—including global functions, local functions, lambdas, local classes, and types with customized serialization using __getstate__/__reduce__/__reduce_ex__, which are not allowed in xlang mode.

See Also