#序列化 #反序列化

deser

一个用于 Rust 的实验性序列化和反序列化库

8 个重大版本更新

0.8.0 2022年2月19日
0.6.0 2022年2月11日

#716编码


用于 3 crates

Apache-2.0

120KB
2.5K SLoC

deser: 一个用于 Rust 的实验性序列化和反序列化库

Crates.io License Documentation

Deser 是一个用于 Rust 的实验性序列化系统。它希望探索结构化格式(如 JSON 或 msgpack)的序列化和反序列化可能性。它故意不支持非自描述格式,如 bincode。

这还不是一款成品。

use deser::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
#[deser(rename_all = "camelCase")]
pub struct Account {
    id: usize,
    account_holder: String,
    is_deactivated: bool,
}

它将生成必要的 SerializeDeserialize 实现。

要查看一些实际示例,请参阅 示例

设计目标

  • 快速编译时间:deser 通过鼓励动态分派来避免过度单态化。目标是避免生成大量重复代码,这些代码会产生编译器需要处理的膨胀。
  • 简单数据模型:deser 在序列化和反序列化接口上简化了数据模型。例如,它们在模型中用相同的方式表示 u8u64。为了补偿这一点,它提供了类型描述符,为序列化器处理时提供辅助信息。这有助于编译时间和简化了使用该库的过程。
  • 原生字节支持:deser 对序列化字节和字节向量的内置特殊化。一个 Vec<u8> 被序列化为字节,不需要对 JSON 等仅支持文本格式的特殊处理。
  • 无限递归:现实世界很复杂,传入的数据可能非常嵌套。Deser 不会因为数据的深度而耗尽调用栈。它通过替代 serde 的 trait 设计来实现这一点,返回“接收器”或“可序列化”对象的句柄。这意味着递归管理取决于调用者。
  • 原生可选支持:序列化系统内置了对可选数据概念的理解。这意味着通过单个属性,结构体序列化器可以跳过所有当前设置为 null 的字段。
  • 原生扁平化支持:deser 的序列化和反序列化支持对结构体的扁平化有原生支持。这意味着不需要内部缓冲区来处理 #[deser(flatten)]
  • 状态化处理:deser通过提供空间来存储元信息来补偿简化数据模型。默认情况下,它提供有关正在序列化的类型的详细信息。额外的空间可以用来在序列化和反序列化过程中跟踪当前结构的“路径”。(请参阅deser-path以获取实际示例)

Deser并不打算取代serde,但它试图解决其中的一些不足。有关更多信息,请参阅有关Serde学习的文档,其中包含更多详细信息。

未来计划

  • 可扩展数据模型:deser希望使数据模型能够扩展到序列化接口非原生类型。例如,如果数据格式想要支持任意大小的整数,这应该在不需要回退到带内信令的情况下成为可能。

已知限制

当前系统的设计非常消耗分配。这是某种程度的灵活性与动态分派特性相结合的结果。例如,对于JSON解析,Serde比Deser快3倍以上,对于反序列化快2.5倍。

  • deser:提供基本功能的内核包
  • deser-json:deser的基本JSON实现
  • deser-path:一个扩展deser以跟踪序列化过程中路径的包
  • deser-debug:将可序列化对象格式化为std::fmt调试格式

灵感来源

此包大量借鉴了miniserdeserdeSentry Relay的元系统。通用的trait设计是以miniserde为模型。

安全性

Deser(目前)在内部使用了大量的不安全代码。它未经审查,并且很可能是完全错误的。如果这种设计证明是有用的,将需要对内部进行重新设计。

依赖项

~215KB