跳到主要内容
版本:0.14

跨语言序列化

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 位浮点数

类型映射

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

与 Python 原生模式的区别

二进制协议和 API 与 pyfory 的 Python 原生模式类似,但 Python 原生模式可以序列化任何 Python 对象——包括全局函数、局部函数、lambda、局部类以及使用 __getstate__/__reduce__/__reduce_ex__ 自定义序列化的类型,这些在 xlang 模式中不允许

另请参阅

相关主题