跳到主要内容
版本:dev

类型注册

本文介绍 Apache Fory™ Rust 的类型注册方法。

按 ID 注册

使用数字 ID 注册类型,以获得快速、紧凑的序列化:

use fory::Fory;
use fory::ForyStruct;

#[derive(ForyStruct)]
struct User {
name: String,
age: i32,
}

let mut fory = Fory::builder().xlang(false).build();
fory.register::<User>(1)?;

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

let bytes = fory.serialize(&user)?;
let decoded: User = fory.deserialize(&bytes)?;

按名称注册

为保证跨语言兼容性,请使用稳定名称注册。使用 . 分隔命名空间前缀和类型名称:

let mut fory = Fory::builder().xlang(true).build();

// Register with symbolic type identity
fory.register_by_name::<MyStruct>("com.example.MyStruct")?;

注册自定义序列化器

对于需要自定义序列化逻辑的类型,请注册自定义序列化器:

let mut fory = Fory::builder().xlang(false).build();
fory.register_serializer::<UuidSerializer>(100)?;

外部结构化序列化器使用普通结构化注册 API:

fory.register::<UserSerializer>(101)?;

序列化器的 Target 是运行时值类型。注册不需要单独的外部类型 API。在字段上,with 可以选择 VecSerializer<UserSerializer> 等确切载体序列化器,而递归 listmaptuple 注解在子节点选择序列化器。在根上组合相同的载体序列化器。载体序列化器不注册。

注册一致性

Rust 注册 API 使用显式 ID 或显式名称。序列化和反序列化对等端应保持相同的注册映射:

// Serializer side
let mut fory = Fory::builder().xlang(false).build();
fory.register::<TypeA>(1)?;
fory.register::<TypeB>(2)?;
fory.register::<TypeC>(3)?;

// Deserializer side - MUST use the same ID mapping
let mut fory = Fory::builder().xlang(false).build();
fory.register::<TypeA>(1)?;
fory.register::<TypeB>(2)?;
fory.register::<TypeC>(3)?;

线程安全注册

在线程启动前完成所有注册:

use std::sync::Arc;
use std::thread;

let mut fory = Fory::builder().xlang(false).build();
fory.register::<User>(1)?;
fory.register::<Order>(2)?;

// Now share across threads
let fory = Arc::new(fory);

let handles: Vec<_> = (0..4)
.map(|_| {
let shared = Arc::clone(&fory);
thread::spawn(move || {
// Use fory for serialization
})
})
.collect();

最佳实践

  1. 使用一致的 ID:为实现跨语言兼容性,所有语言使用相同类型 ID
  2. 线程启动前注册:在线程启动前完成所有注册
  3. 跨语言模式使用命名空间:使类型名称在各语言间保持一致
  4. 显式 ID 保证稳定性:生产环境避免自动生成 ID

相关主题