#serialization #deserialize #trait-object #serde #format-json #string-key

serde_tagged

在序列化过程中标记值,在反序列化过程中检索标记

4 个版本 (2 个破坏性更新)

使用旧的 Rust 2015

0.3.0 2023 年 12 月 29 日
0.2.0 2018 年 3 月 14 日
0.1.1 2018 年 3 月 12 日
0.1.0 2018 年 3 月 12 日

#195 in 编码

Download history 97/week @ 2024-03-13 125/week @ 2024-03-20 121/week @ 2024-03-27 92/week @ 2024-04-03 90/week @ 2024-04-10 82/week @ 2024-04-17 102/week @ 2024-04-24 92/week @ 2024-05-01 87/week @ 2024-05-08 77/week @ 2024-05-15 123/week @ 2024-05-22 174/week @ 2024-05-29 99/week @ 2024-06-05 105/week @ 2024-06-12 100/week @ 2024-06-19 74/week @ 2024-06-26

每月下载 383
29 个crate中使用了(3 个直接使用)

MIT/Apache

240KB
6K SLoC

Serde Tagged

Build Status Coverage crates.io docs.rs

在序列化过程中标记值,在反序列化过程中检索标记。

Serde 是 Rust 语言的强大、高效且通用的序列化框架。然而,它不支持(直接)特例对象的反/序列化。特别是无法预先确定类型的特例对象的反序列化需要额外的代码层来根据数据格式中可以存储的信息检索该类型。

此库旨在提供一种框架,用于在序列化过程中将包含类型信息的标记与值一起存储,并在反序列化过程中检索它们。为此,提供了多种标记格式,这些格式与所使用的数据格式独立1。标记格式在很大程度上类似于 已用于 serde 的枚举标记格式

[1]:然而,某些数据格式可能会施加限制,例如,JSON 对象只能包含字符串作为键,这反过来限制了可以使用的外部标记格式与字符串一起使用的标记类型,用于 JSON 后端。

标记格式

serde_tagged 支持多种标记格式。以下是一个简要概述

外部标记

外部标记格式使用具有单个条目的映射来应用标记,其中标记是键,条目的值是条目的值。以一种较为直观的形式,这将产生

{ <tag> => <value> }

其中 value 可以是任何可序列化/反序列化的值,但 tag 受所使用格式的限制(例如,JSON 只允许字符串)。此格式的优点是当序列化到可读的格式时,它相对易于阅读,但也可以在序列化到二进制格式时更紧凑。此外,由于清晰的顺序(标记在值之前),反序列化可能比其他格式(如内部和基于非元组的相邻标记)更快。但是,对于配置文件和主要基于文本的数据格式,您可能想查看内部标记格式。

内部标记

此格式内部标记值,意味着标签被嵌入到值中。但是,并不是所有值类型都支持嵌入标签(例如,原始类型如 i32)。

这种格式的优点是(主观上)在配置文件中更容易阅读。使用此标记方案的TOML配置文件可能看起来像这样

[log]
type = "terminal"   # this is the tag
level = "trace"     # this is a value-specific entry
color = "auto"      # this is another value-specific entry

然而,解析此格式需要分配,因此当您使用的数据格式是二进制且/或您关心性能时,您可能希望选择另一种格式。

使用元组的相邻标记

基于元组的相邻格式类似于外部紧凑格式,由于其预定义的标签值顺序,因此易于反序列化,但可能不那么容易阅读。标签和值对存储为元组,即

( <tag>, <value> )

使用映射的相邻标记

基于映射的相邻标记格式使用两个映射条目应用标签,其中一个条目包含从标签键到标签的映射,另一个条目包含从值键到值的映射。具体来说,这会产生

{ <tag-key> => <tag>, <value-key> => <value> }

这种格式在用作人类可读的数据格式时更有意义,但也由于标签和值的顺序未定义,在反序列化时可能需要潜在的堆分配。

使用结构体的相邻标记

基于结构体的相邻标记格式类似于基于映射的相邻标记格式,但在这里,带标签的值被序列化为结构体,其中键是结构体字段的名称。具体来说,这会产生

{ <tag-key>: <tag>, <value-key>: <value> }

此标记格式在数据格式中的表示在很大程度上取决于后者,因此它可以是紧凑的(msgpack、bincode)或冗长的(JSON)。

用法

请查看 示例目录。一个良好的起点是 特质对象示例。此示例解释了使用外部标记格式(其他格式可以非常相似地使用)对特质对象进行反/序列化相关的所有相关细节。当然,您不仅可以序列化和反序列化特质对象,还可以序列化和反序列化带有标签的任何可序列化和可反序列化的值。此外,请参阅 API 文档

可选功能

默认情况下,此crate使用带有 erased 功能构建(这需要 erased-serde 作为依赖项)。此功能旨在通过提供类型和特质来简化与 erased-serde 的交互,简化类型擦除特质对象的反序列化。

许可

根据您的选择,许可以下任一许可

贡献

除非您明确声明,否则您故意提交的任何贡献,根据Apache-2.0许可证的定义,均应按照上述双重许可,不附加任何额外条款或条件。

依赖关系

~110–385KB