跳到主要内容
版本:0.14

跨语言序列化

Apache Fory™ 支持在多种语言(包括 Java、Python、C++、Go 和 JavaScript)之间无缝进行数据交换。

启用跨语言模式

use fory::Fory;

// 启用跨语言模式
let mut fory = Fory::default()
.compatible(true)
.xlang(true);

// 使用跨语言一致的 ID 注册类型
fory.register::<MyStruct>(100);

// 或使用基于命名空间的注册
fory.register_by_namespace::<MyStruct>("com.example", "MyStruct");

跨语言类型注册

按 ID 注册

对于使用跨语言一致 ID 的快速、紧凑序列化:

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

fory.register::<User>(100); // 在 Java、Python 等中使用相同的 ID

按命名空间注册

对于更灵活的类型命名:

fory.register_by_namespace::<User>("com.example", "User");

跨语言示例

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::<Person>(100);

let person = Person {
name: "Alice".to_string(),
age: 30,
};

let bytes = fory.serialize(&person)?;
// bytes 可以被 Java、Python 等反序列化

Java(反序列化器)

import org.apache.fory.*;
import org.apache.fory.config.*;

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

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

fory.register(Person.class, 100); // 与 Rust 使用相同的 ID

Person person = (Person) fory.deserialize(bytesFromRust);

Python(反序列化器)

import pyfory
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: pyfory.int32

fory = pyfory.Fory(ref_tracking=True)
fory.register_type(Person, type_id=100) # 与 Rust 使用相同的 ID

person = fory.deserialize(bytes_from_rust)

类型映射

有关跨语言完整类型映射,请参阅 xlang_type_mapping.md

常见类型映射

RustJavaPython
i32intint32
i64longint64
f32floatfloat32
f64doublefloat64
StringStringstr
Vec<T>List<T>List[T]
HashMap<K,V>Map<K,V>Dict[K,V]
Option<T>可空 TOptional[T]

最佳实践

  1. 使用一致的类型 ID:在所有语言中使用相同的 ID
  2. 启用 compatible 模式:用于 schema 演化
  3. 注册所有类型:在序列化之前
  4. 测试跨语言:在开发期间测试兼容性

另请参阅

相关主题