4个版本 (2个破坏性更新)

0.3.1 2023年3月5日
0.3.0 2022年1月24日
0.2.0 2022年1月20日
0.1.0 2022年1月8日

#1037 in 编码

MIT/Apache

48KB
1K SLoC

GS11N

GS11N是一个专注于游戏开发的序列化crate。通过添加属性,你的Rust代码将看起来像Unity或UE中的脚本。

使用GS11N所需的最小Rust版本是1.57.0

#[derive(GS11N, Default)]
struct Orc {
  #[serialized(0)]
  health: usize,
  #[serialized(1)]
  mana: usize,
}

然后序列化和反序列化它

let encoder = Encoder::from(&orc);
let buffer = encoder.encode();

let decoder = Decoder::from_data(buffer);
let orc: Orc = decoder.decode().unwrap();

请注意,你的结构体类型目前必须实现trait Default,这种限制可能会在未来放宽。

GS11N借鉴了Protobuf的一些想法,包括

  1. 结构体或枚举的每个字段都可以(不一定必须)有一个ID,这使得不同版本的类型可以兼容。
  2. 使用varint编码来减小序列化的大小。

其他特性包括

  1. 你可以序列化一个dyn类型,但需要给出一个类型ID(查看测试用例以获取示例)
  2. 你的dyn类型可以编译成一个动态库,然后稍后加载,这在调试或代码更新(例如热修复或DLC)时可能很有用。
  3. 预制件加载器:当你创建解码器时,可以提供一个预制件加载器,在其中你可以将GS11N绑定到你的资源系统中。
  4. 你可以将整个类型序列化,通常是一些通用类型,以简化代码
#[derive(PartialEq, Debug, GS11N, Default)]
#[compact]
struct Color {
  r: u8,
  g: u8,
  b: u8,
};

请注意,如果你选择这样做,当字段被添加或删除时,编码的数据将不再兼容

如果你不想生成序列化或反序列化代码

#[derive(PartialEq, Debug, GS11N, Default)]
#[no_deserialization]
struct Foo {
  str: &'static str,
}

正在进行中的功能

  1. 关于序列化数据的可选信息,对于游戏编辑器可能很有用。
  2. 使用注释而不是属性。
  3. 可读的序列化和反序列化数据格式
  4. 不要编码值默认的字段(这可能需要不稳定的功能)

依赖项

~1.5MB
~36K SLoC