7个版本 (破坏性更新)
0.8.0 | 2022年2月19日 |
---|---|
0.7.0 | 2022年2月13日 |
0.6.0 | 2022年2月11日 |
0.5.0 | 2022年2月8日 |
0.3.1 | 2022年2月5日 |
#343 in #experimental
在 2 个crate中使用 (通过 deser)
58KB
1K 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
之间做出区分,它们在模型中具有相同的表示。为了弥补这一点,它提供了类型描述符,为序列化器在处理它时提供辅助信息。这有助于编译时间,并使使用crate更容易。 - 原生字节支持:deser具有序列化字节和字节向量的内置专用功能。一个
Vec<u8>
被序列化为字节,不需要为如JSON等纯文本格式进行特殊处理。 - 无限递归:现实世界很复杂,传入的数据可能非常嵌套。Deser不会因为数据有多深就耗尽调用栈。它通过替代serde的trait设计来实现这一点,其中返回“sink”或“可序列化”对象的句柄。这意味着递归管理取决于调用者。
- 本地可选值:序列化系统内置了对可选数据概念的理解。这意味着,结构体序列化器可以通过单个属性跳过所有当前设置为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
依赖项
~1.5MB
~36K SLoC