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 编码
每月下载量 1,383,281 次
用于 1,886 个 crate (546 直接使用)
160KB
3K SLoC
Borsh in Rust ┃
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])
如果你有具有显式区分符的枚举时是必需的。此设置同时影响 BorshSerialize
和 BorshDeserialize
的行为。
将来,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-MIT和LICENSE-APACHE。
依赖项
~0–1.4MB
~26K SLoC