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
| Python | Java | Rust | Go |
|---|---|---|---|
str | String | String | string |
int | long | i64 | int64 |
pyfory.int32 | int | i32 | int32 |
pyfory.int64 | long | i64 | int64 |
float | double | f64 | float64 |
pyfory.float32 | float | f32 | float32 |
list | List | Vec | []T |
dict | Map | HashMap | map[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
- Cross-Language Serialization Specification
- Type Mapping Reference
- Java Cross-Language Guide
- Rust Cross-Language Guide
Related Topics
- Configuration - XLANG mode settings
- Schema Evolution - Compatible mode
- Type Registration - Registration patterns