7 个版本
0.2.1 | 2024年3月4日 |
---|---|
0.2.0 | 2023年7月3日 |
0.1.4 | 2023年1月9日 |
0.1.3 | 2022年12月12日 |
0.1.0 | 2021年10月16日 |
#991 in 编码
7,528 每月下载次数
在 7 个 crate 中使用 (via conjure-serde)
135KB
4K SLoC
serde-smile
Smile 的 Serde 实现。
Smile 是由 Jackson 序列化库的 Java 开发者创建的一种二进制数据格式。它被设计成 JSON 的二进制等价物。
lib.rs
:
Smile 的 Serde 实现。
Smile 是由 Jackson 序列化库的 Java 开发者创建的一种二进制数据格式。它被设计成 JSON 的二进制等价物。
序列化选项
Smile 定义了几个可选功能,可以在序列化过程中启用或禁用
Builder::raw_binary
: 如果启用,二进制数据将直接作为“原始”字节进行编码,而不是使用 Smile 的 7 位“安全”编码。原始格式更小,并且序列化和反序列化速度更快,但使用意味着编码值可能包含 Smile 控制字符,例如流结束令牌0xff
。默认禁用。Builder::shared_strings
: 如果启用,64 字节及以下的字符串值将在编码格式中进行去重。这会增加序列化和反序列化的内存开销,但可以在字符串重复时显著减小编码值的尺寸。默认禁用。Builder::shared_properties
: 如果启用,64 字节及以下的映射键将在编码格式中进行去重。这会增加序列化和反序列化的内存开销,但可以在键重复时显著减小编码值的尺寸(尤其是结构体字段名称)。默认启用。Serializer::end
: 可以通过流结束令牌0xff
选项地终止 Smile 值序列。调用此方法将在输出流中写入令牌。
特殊类型
Smile支持Serde原生处理不支持的两种值:任意精度整数和小数。这个crate定义了特殊类型BigInteger
和BigDecimal
,它们将分别序列化和反序列化为相应的Smile类型。然而,它们仅应与在此crate中定义的序列化器和反序列化器一起使用,因为当与其他Serde库一起使用时,它们将生成无意义的值。
编码注意事项
无法存储在i64
中的Rust整数值将被序列化为Smile的BigInteger
值。相反,如果值足够小,BigInteger
值将被反序列化为Rust整数类型。
示例
将Rust对象序列化为Smile值
use serde::Serialize;
use serde_smile::Error;
#[derive(Serialize)]
struct Address {
number: u32,
street: String,
}
fn main() -> Result<(), Error> {
let address = Address {
number: 1600,
street: "Pennsylvania Avenue".to_string(),
};
let value = serde_smile::to_vec(&address)?;
Ok(())
}
将Smile值反序列化为Rust对象
use serde::Deserialize;
use serde_smile::Error;
#[derive(Deserialize)]
struct Address {
number: u32,
street: String,
}
fn main() -> Result<(), Error> {
let smile = b":)\n\x01\xfa\x85number\x24\x32\x80\x85street\x52Pennsylvania Avenue\xfb";
let address: Address = serde_smile::from_slice(smile)?;
println!("{} {}", address.number, address.street);
Ok(())
}
依赖项
~1–1.5MB
~27K SLoC