#serialization #developing #varint #derive #unity #deserialize #gs11n

gs11n_derive

游戏开发中的varint序列化框架

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日

#34 in #varint

MIT/Apache

28KB
552

GS11N

GS11N 是一个专注于 游戏开发Serialization 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
~37K SLoC