2 个版本

0.5.1 2021 年 4 月 9 日
0.5.0 2020 年 10 月 9 日

#1821 in 编码

Apache-2.0

48KB
952

Build Status

rustdoc

未维护的原始包

bytekey

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

支持的数据类型

bytekey 目前支持所有 Rust 基本类型、字符串、选项、结构体、枚举、向量以及元组。有关序列化格式的详细信息,请参阅 序列化器

使用方法

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

use bytekey::{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());
}

类型演变

通常,必须知道序列化值的精确类型才能正确反序列化它。对于结构和枚举,一旦序列化了该类型的任何值,类型实际上就固定了:对结构或枚举的更改将导致已序列化值的反序列化失败或返回错误值。唯一的例外是向现有枚举的末尾添加新变体。枚举变体不能更改类型、删除或重新排序。禁止对结构进行任何更改,包括添加、删除、重新排序或更改字段类型。

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

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

许可证

bytekey 在 Apache 许可证版本 2.0 下授权。有关完整许可证文本,请参阅 LICENSE。

依赖关系

~215–485KB