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 编码
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的一些想法,包括
- 结构体或枚举的每个字段都可以(不一定必须)有一个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
~36K SLoC