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 编码

Download history 1921/week @ 2024-05-03 1569/week @ 2024-05-10 1707/week @ 2024-05-17 1560/week @ 2024-05-24 1793/week @ 2024-05-31 1889/week @ 2024-06-07 1902/week @ 2024-06-14 1285/week @ 2024-06-21 1914/week @ 2024-06-28 1552/week @ 2024-07-05 1926/week @ 2024-07-12 1640/week @ 2024-07-19 2032/week @ 2024-07-26 1820/week @ 2024-08-02 1958/week @ 2024-08-09 1477/week @ 2024-08-16

7,528 每月下载次数
7 个 crate 中使用 (via conjure-serde)

MIT/Apache

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定义了特殊类型BigIntegerBigDecimal,它们将分别序列化和反序列化为相应的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