48 个版本 (11 个稳定版)

1.5.1 2024 年 5 月 31 日
1.4.0 2024 年 3 月 26 日
1.3.0 2023 年 12 月 18 日
1.2.0 2023 年 11 月 13 日
0.2.10 2019 年 11 月 27 日

#26 in 编码

Download history 307381/week @ 2024-05-03 325013/week @ 2024-05-10 303142/week @ 2024-05-17 291006/week @ 2024-05-24 339632/week @ 2024-05-31 321470/week @ 2024-06-07 312640/week @ 2024-06-14 312169/week @ 2024-06-21 300961/week @ 2024-06-28 321915/week @ 2024-07-05 292302/week @ 2024-07-12 308784/week @ 2024-07-19 326252/week @ 2024-07-26 377148/week @ 2024-08-02 347096/week @ 2024-08-09 274157/week @ 2024-08-16

每月下载量 1,383,281
用于 1,886 个 crate (546 直接使用)

MIT/Apache

160KB
3K SLoC

Borsh in Rust ┃ 最新版本 borsh: rustc 1.67+ License Apache-2.0 徽章 License MIT 徽章

borsh-rsBorsh 二进制序列化格式的 Rust 实现。

Borsh 代表 哈希二进制对象表示序列化器。它旨在用于安全性关键的项目,因为它优先考虑 一致性、安全性和速度,并附带严格的 规范

示例

use borsh::{BorshSerialize, BorshDeserialize, from_slice, to_vec};

#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]
struct A {
    x: u64,
    y: String,
}

#[test]
fn test_simple_struct() {
    let a = A {
        x: 3301,
        y: "liber primus".to_string(),
    };
    let encoded_a = to_vec(&a).unwrap();
    let decoded_a = from_slice::<A>(&encoded_a).unwrap();
    assert_eq!(a, decoded_a);
}

功能

从 Serde 中排除可以使得 borsh 具有一些目前 serde 兼容序列化器所不具备的功能。目前我们支持两个功能:borsh(init=<你的初始化方法名称>borsh(skip)(前者在 Serde 中不可用)。

borsh(init=...) 允许在反序列化后自动运行初始化函数。这为那些设计成严格不可变对象的架构增加了许多便利。使用示例

#[derive(BorshSerialize, BorshDeserialize)]
#[borsh(init=init)]
struct Message {
    message: String,
    timestamp: u64,
    public_key: CryptoKey,
    signature: CryptoSignature
    hash: CryptoHash
}

impl Message {
    pub fn init(&mut self) {
        self.hash = CryptoHash::new().write_string(self.message).write_u64(self.timestamp);
        self.signature.verify(self.hash, self.public_key);
    }
}

borsh(skip) 允许跳过序列化/反序列化字段,假设它们实现了 Default 特性,类似于 #[serde(skip)]

#[derive(BorshSerialize, BorshDeserialize)]
struct A {
    x: u64,
    #[borsh(skip)]
    y: f32,
}

具有显式区分符的枚举

#[borsh(use_discriminant=false|true]) 如果你有具有显式区分符的枚举时是必需的。此设置同时影响 BorshSerializeBorshDeserialize 的行为。

将来,borsh 将取消对显式使用 #[borsh(use_discriminant=false|true)] 的要求,并默认为 true,但为了确保从 borsh 的旧版本(0.11 之前发布)过渡不会在反-/序列化中造成静默的破坏性更改,borsh 1.0 将要求指定是否应使用显式枚举区分符作为反-/序列化标签值。

如果你没有指定具有显式区分符的枚举的 use_discriminant 选项,你会得到一个错误

error: You have to specify `#[borsh(use_discriminant=true)]` or `#[borsh(use_discriminant=false)]` for all enums with explicit discriminant

为了保留 borsh 0.11 之前的版本的行为,这些版本在反-/序列化时不尊重显式枚举区分符,请使用 #[borsh(use_discriminant=false)],否则请使用 true

#[derive(BorshDeserialize, BorshSerialize)]
#[borsh(use_discriminant=false)]
enum A {
    X,
    Y = 10,
}

测试

通常应首选集成测试而不是单元测试。borsh crate 的集成测试的根模块在此处 链接

发布

此存储库中所有公共 crate 的版本由 工作区清单 中的单个版本共同管理。

因此,要发布所有 crate 的新版本,您只需将其提升到下一个“补丁”版本并提交一个 PR 即可。

我们已部署CI基础设施以自动化发布所有crate的过程,一旦版本更改合并到master分支。

然而,在发布之前,请确保变更日志是最新的,并且[未发布]部分存在但为空。

许可证

此存储库在MIT许可证和Apache许可证(版本2.0)的条款下分发。有关详细信息,请参阅LICENSE-MITLICENSE-APACHE

依赖项

~0–1.4MB
~26K SLoC