16个版本 (9个破坏性更新)
0.10.0 | 2024年2月9日 |
---|---|
0.9.0 | 2023年11月17日 |
0.8.0 | 2023年11月14日 |
0.7.0 | 2022年10月10日 |
0.2.1 | 2022年2月11日 |
#44 在 #binary-serialization
9,283 每月下载量
在 17 个crate中使用 (通过 packable)
35KB
742 行
Packable 是一个二进制序列化和反序列化框架。
设计
如果一个类型的值实现了 Packable
特性,则该类型的值可以进行序列化和反序列化。每种类型的序列化策略由用户决定。然而,Packable
也可以进行推导,这提供了一个一致的序列化策略。
有关此crate设计的信息,请阅读 Packable
、unpacker
、packer
、UnpackError
和 UnpackErrorExt
的文档。
no_std
兼容性
Packable 兼容 no_std
。这是通过引入 Packer
和 Unpacker
特性来实现的,这些特性可以抽象化任何IO操作,而不依赖于 std::io
。这还有一个额外的优势,即允许我们从不同类型的缓冲区中打包和解包值。
实现 Packable
特性的类型
Packable
特性为所有有大小整数类型实现,通过将值编码为小端顺序的字节数组。
布尔值按照Rust的数据布局打包,这意味着 true
被打包为一个字节的 1
,而 false
被打包为一个字节的 0
。然而,布尔值解包较为宽松,将任何非零字节解包为 true
。
以下类型,如Box<[T]>
、[T; N]
和Option<T>
,当类型T
实现了Packable
接口时,也将实现Packable
接口。
此crate还在bounded
模块下提供了有界整数,该模块具有额外的语法检查,以确保反序列化后的值在有效范围内。还可以使用prefix
模块中提供的类型序列化和反序列化值序列,这些类型表示具有长度前缀的线性值序列。
有关更多信息,请查看Packable
的impl
部分。
特性
io
此特性提供了类型IoPacker
和IoUnpacker
,允许对实现了Write
和Read
的类型进行打包和解包。
primitive-types
此特性实现了Packable
接口,用于U256
编码,其值以小端顺序的字节数组表示。
serde
此特性为bounded
和prefix
模块中提供的类型派生Serialize
和Deserialize
。
std
此特性实现了此crate提供的所有错误类型的Error
。
usize
此特性实现了Packable
接口,用于usize
、isize
、Vec<T>
、Box<[T]>
和String
。这是通过将指针大小的整数序列化和反序列化成64位整数来实现的。对于指针宽度大于64的目标,此功能将不起作用。
许可证:Apache-2.0
依赖项
~3MB
~56K SLoC