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日

#249 in 编码

Download history 320711/week @ 2024-04-25 308035/week @ 2024-05-02 318206/week @ 2024-05-09 309682/week @ 2024-05-16 287828/week @ 2024-05-23 338029/week @ 2024-05-30 322388/week @ 2024-06-06 316592/week @ 2024-06-13 313264/week @ 2024-06-20 312225/week @ 2024-06-27 308509/week @ 2024-07-04 299294/week @ 2024-07-11 301421/week @ 2024-07-18 327676/week @ 2024-07-25 368866/week @ 2024-08-01 296045/week @ 2024-08-08

1,353,161 每月下载量
1,862 个crate中使用 (52 个直接使用)

Apache-2.0

190KB
4.5K SLoC

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

borsh-rs 是Borsh二进制序列化格式的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。

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

许可证

本仓库同时遵循MIT许可证和Apache许可证(版本2.0)的条款。有关详细信息,请参阅LICENSE-MITLICENSE-APACHE

依赖项

~1.4–2MB
~42K SLoC