3个版本

使用旧Rust 2015

0.4.5 2023年11月7日
0.4.4 2023年10月6日
0.4.3 2020年12月28日

#1445 in 编码

Apache-2.0

55KB
1K SLoC

Build Status Build Status Rustdoc

bytekey2

对Rust值进行二元编码,同时保持字典序排序。保持顺序的编码对于创建具有字节字符串类型键的排序键值存储的键很有用,例如leveldbsledbytekey2尝试将值编码到尽可能少的字节数,同时保持顺序保证。类型信息不会与值一起序列化,因此必须知道序列化数据类型才能进行解码(bytekey2不实现自描述格式)。

支持的数据类型

bytekey2目前支持所有Rust原语、字符串、选项、结构体、枚举、vec和元组。有关序列化格式的详细信息,请参阅序列化器

使用方法

#[macro_use]
extern crate serde_derive;
extern crate bytekey2;

use bytekey2::{deserialize, serialize};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct MyKey { a: u32, b: String }

fn main() {
    let a = MyKey { a: 1, b: "foo".to_string() };
    let b = MyKey { a: 2, b: "foo".to_string() };
    let c = MyKey { a: 2, b: "fooz".to_string() };
    assert!(serialize(&a).unwrap() < serialize(&b).unwrap());
    assert!(serialize(&b).unwrap() < serialize(&c).unwrap());
    assert_eq!(a, deserialize(&serialize(&a).unwrap()).unwrap());
}

类型进化

通常,为了正确反序列化,必须知道序列化值的确切类型。对于结构和枚举,一旦类型中的任何值被序列化,类型实际上就被冻结了:对结构或枚举的更改会导致已序列化值的反序列化失败或返回错误值。唯一的例外是向现有枚举的末尾添加新变体。枚举变体不得更改类型、删除或重新排序。所有对结构的更改,包括添加、删除、重新排序或更改字段类型都是禁止的。

这些限制导致在使用bytekey2序列化时有一些最佳实践

  • 除非你需要序列化值的字典序排序,否则不要使用bytekey2!如果此功能不是必需的,则更通用的编码库(如Cap'n Protobincode)将更好地为你服务。
  • 如果你将序列化值持久化超过进程的生命周期(即你将序列化值写入文件或数据库),请考虑使用枚举作为顶层包装类型。这将允许你在向后兼容的方式下无缝添加新变体,当你需要以向后兼容的方式更改键格式时(不同键类型将单独排序)。如果你的枚举有不到16个变体,则开销只是序列化输出中的单个字节。

许可证

bytekey2受Apache许可证,版本2.0许可。请参阅LICENSE以获取完整的许可证文本。

依赖关系

~215–485KB
~10K SLoC