0.1.0 |
|
---|
#94 in #cbor
175KB
4K SLoC
这是一个临时分支,只是为了发布在#25中提出的更改。请不要使用这个版本,请使用ciborium。
ciborium
欢迎来到Ciborium!
Ciborium包含为serde提供的CBOR序列化和反序列化实现。
快速入门
你很可能在寻找de::from_reader()
和ser::into_writer()
,这是主要功能。请注意,字节切片也是读取器和写入器,可以像流一样传递给这些函数。
对于动态CBOR值创建/检查,请参阅value::Value
。
设计决策
始终将数值序列化为最小的尺寸
尽管CBOR规范有不同的数值宽度,但这只是线路上的一种压缩形式,并不旨在直接表示“整数宽度”或“浮点宽度”。因此,ciborium始终将数字序列化为可能的最小无损失编码。例如,我们将1u128
序列化为单个字节(01
)。同样,我们也可以自由地将该单个字节解码为u128
。
虽然这会带来一些微小的性能开销,但选择这个方案有以下几个原因。首先,规范似乎通过使用单独的位表示符号来暗示这一点。其次,规范要求实现处理前导零;宽松地解读这意味着需要无损失强制转换。第三,动态语言如Python没有“整数宽度”的概念,这使得这是与这些语言实现最大线路兼容性的实用选择。
这种强制转换总是无损失的。对于浮点数,这意味着我们仅在强制转换回原始大小时具有与原始相同的原始位时,才将它们转换为更小的尺寸。
与其他实现兼容性
ciborium项目遵循鲁棒性原则。因此,我们旨在接受宽容。这意味着我们旨在在解码时与其他实现保持线缆兼容,但在编码时则不一定。
一个显著的例子是,serde_cbor
使用固定宽度的数字编码且不进行无损转换。这意味着ciborium
可以成功解码serde_cbor
的编码,但反之则可能不行。
将映射表示为值序列
其他serde解析器通常采用使用BTreeMap
或HashMap
来实施它们编码的底层Map
类型的方法。这个crate选择使用Vec<(Value, Value)>
来表示Map
类型。
这个决定是因为这种类型保留了线上对的数据对顺序。此外,对于那些需要BTreeMap
或HashMap
属性的人来说,你可以简单地将值收集到相应的类型中。这提供了最大的灵活性。
底层库
ciborium crate在(私有)basic
模块中开始有一个底层库。我们可能会将其扩展为更健壮,并在其处于良好状态时将其公开。如果您想与我们合作,请与我们联系。或者,我们可能将此代码分叉到一个没有serde依赖的单独crate中。
内部类型
ciborium crate包含了一些实现有用的serde特质的内部类型。虽然这些目前还没有公开,但如果需求,我们可能会选择在未来公开它们。通常,这个crate采取保守的方法来公开API,以避免破坏。
打包编码?
打包编码使用数值偏移来表示结构字段名和枚举变体名。这可以在线上节省大量的空间。
尽管这个crate的作者喜欢打包编码,但通常应避免使用它,因为它可能会很脆弱,因为它将Rust代码的断言暴露给远程参与者。我们可能会考虑在未来添加这个功能。如果您对此感兴趣,请与我们联系。
许可证:Apache-2.0
依赖项
~0.6–1.2MB
~29K SLoC