跨语言序列化
pyfory 支持跨语言对象图序列化,允许您在 Python 中序列化数据,并在 Java、Go、Rust 或其他支持的语言中反序列化。
启用跨语言模式
要使用 xlang 模式,创建 Fory 时设置 xlang=True:
import pyfory
fory = pyfory.Fory(xlang=True, ref=False, strict=True)
跨语言示例
Python(序列化器)
import pyfory
from dataclasses import dataclass
# 跨语言模式实现互操作性
f = pyfory.Fory(xlang=True, ref=True)
# 注册类型以实现跨语言兼容性
@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 现在可以发送到 Java、Go 等
Java(反序列化器)
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(反序列化器)
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)?;
跨语言的类型注解
使用 pyfory 类型注解进行显式跨语言类型映射:
from dataclasses import dataclass
import pyfory
@dataclass
class TypedData:
int_value: pyfory.int32 # 32 位整数
long_value: pyfory.int64 # 64 位整数
float_value: pyfory.float32 # 32 位浮点数
double_value: pyfory.float64 # 64 位浮点数
类型映射
| 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 |
与 Python 原生模式的区别
二进制协议和 API 与 pyfory 的 Python 原生模式类似,但 Python 原生模式可以序列化任何 Python 对象——包括全局函数、局部函数、lambda、局部类以及使用 __getstate__/__reduce__/__reduce_ex__ 自定义序列化的类型,这些在 xlang 模式中不允许。