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
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中借鉴了一些思想,包括
- 结构体或枚举的每个字段都可以(不一定)有一个ID,这使得不同版本的类型兼容。
- 使用varint编码来减少序列化的大小。
其他特性包括
- 你可以序列化一个
dyn
类型,但需要给类型一个类型ID(检查测试用例) - 你的
dyn
类型可以编译成动态库,并在以后加载它,这在调试或代码更新时非常有用(例如热修复或DLC)。 - 预制件加载器:在创建解码器时,你可以提供一个预制件加载器,其中你可以将GS11N绑定到你的资源系统中。
- 你可以将整个类型序列化,通常是一些常见的类型,以简化代码
#[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.5MB
~37K SLoC