8 个重大版本更新
0.8.0 | 2022年2月19日 |
---|---|
0.6.0 | 2022年2月11日 |
#716 在 编码
用于 3 crates
120KB
2.5K SLoC
deser: 一个用于 Rust 的实验性序列化和反序列化库
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,
}
它将生成必要的 Serialize
和 Deserialize
实现。
要查看一些实际示例,请参阅 示例。
设计目标
- 快速编译时间:deser 通过鼓励动态分派来避免过度单态化。目标是避免生成大量重复代码,这些代码会产生编译器需要处理的膨胀。
- 简单数据模型:deser 在序列化和反序列化接口上简化了数据模型。例如,它们在模型中用相同的方式表示
u8
和u64
。为了补偿这一点,它提供了类型描述符,为序列化器处理时提供辅助信息。这有助于编译时间和简化了使用该库的过程。 - 原生字节支持: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
调试格式
灵感来源
此包大量借鉴了miniserde
、serde
和Sentry Relay的元系统。通用的trait设计是以miniserde
为模型。
安全性
Deser(目前)在内部使用了大量的不安全代码。它未经审查,并且很可能是完全错误的。如果这种设计证明是有用的,将需要对内部进行重新设计。
许可证和链接
- 问题跟踪器
- 文档
- 许可证:Apache-2.0
依赖项
~215KB