6 个版本 (破坏性)
0.5.0 | 2024 年 6 月 4 日 |
---|---|
0.4.0 | 2024 年 2 月 10 日 |
0.3.0 | 2023 年 11 月 1 日 |
0.3.0-rc.1 | 2023 年 10 月 29 日 |
0.1.0 | 2023 年 4 月 28 日 |
#218 在 编码
2,002 每月下载量
在 cw-ica-controller 中使用
115KB
1.5K SLoC
anybuf
一个最小化、零依赖的 protobuf 编码器和解码器,用于编码/解码任何内容。它旨在创建 protobuf Any
的 value
字节,因此得名。
由于其底层设计,anybuf 允许您以多种方式出错,您应该对 protobuf 编码的工作原理有坚实的理解,以便更好地理解 API。
anybuf 包被分成两个主要组件
anybuf::Anybuf
是一个 protobuf 编码器anybuf::Bufany
是一个 protobuf 解码器
非目标
- protobuf 2 事物
- 字段排序
- 组支持(已弃用,见 https://protobuf.com.cn/programming-guides/proto2/#groups)
支持
- Varint 字段(bool/uint32/uint64/sint32/sint64/int32/int64)
- 可变长度字段(字符串/字节)
- 嵌套消息:只需附加一个
Anybuf
实例即可 - 重复(bool/uint32/uint64/sint32/sint64/int32/int64/字符串/字节/消息)
尚未支持
- 固定长度类型
- 重复字段的打包编码
- 支持映射(但您可以使用等效的 通过重复消息进行编码)
如何使用它
编码
use anybuf::Anybuf;
let data = Anybuf::new()
.append_uint64(1, 4) // field number 1 gets value 4
.append_string(2, "hello") // field number 2 gets a string
.append_bytes(3, b"hello") // field number 3 gets bytes
.append_message(4, &Anybuf::new().append_bool(3, true)) // field 4 gets a message
.append_repeated_uint64(5, &[23, 56, 192]) // field number 5 is a repeated uint64
.into_vec(); // done
// data is now a serialized protobuf document
解码
use anybuf::Bufany;
let deserialized = Bufany::deserialize(&data).unwrap(); // data from above
let id = deserialized.uint64(1).unwrap(); // 4
let title = deserialized.string(2).unwrap(); // "hello"
no_std
支持
从版本 0.5.0 开始,有一个默认的 std
功能。如果您删除它,库将使用 no_std
支持进行构建。由于 anybuf 维护者不需要 no_std
支持,因此这仅以最大努力为基础提供,可能存在缺陷。
[dependencies]
anybuf = { version = "0.5.0", default-features = false }