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)

Apache-2.0

58KB
1K 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之间做出区分,它们在模型中具有相同的表示。为了弥补这一点,它提供了类型描述符,为序列化器在处理它时提供辅助信息。这有助于编译时间,并使使用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调试格式

灵感来源

此软件包大量借鉴了miniserdeserdeSentry Relay的元系统。通用trait设计仿照了miniserde

安全性

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

依赖项

~1.5MB
~36K SLoC