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 编码
1,353,161 每月下载量
在 1,862 个crate中使用 (52 个直接使用)
190KB
4.5K 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。
但是,在发布之前,请确保 变更日志 是最新的,并且 [Unreleased]
部分存在但为空。
许可证
本仓库同时遵循MIT许可证和Apache许可证(版本2.0)的条款。有关详细信息,请参阅LICENSE-MIT和LICENSE-APACHE。
依赖项
~1.4–2MB
~42K SLoC