3 个版本

0.1.2 2018年12月31日
0.1.1 2018年12月31日
0.1.0 2018年12月31日

#1339 in 编码

MIT 许可证

46KB
990

exist

exist是Rust中的自描述持久化库。

有一些数据和类型,并且想尽可能从数据中构建与该类型最接近的对象,并具有适当的语义?如果您需要这样做,这个库可能有一天会帮助您实现这一目标,以及首先导出数据。

此库尚未完成,目前根本无法使用。它将有望发展成为可用的概念验证,然后可能投入生产,但我的主要关注点是学习Rust,并尝试各种Rust特性、工具和设计模式。

exist的目标是提供一种简单的方法来序列化Rust数据结构(主要是主要由结构体和序列类型组成的树状结构),以便即使序列化的模式(您正在反序列化的Rust类型)与序列化的模式不匹配,也可以进行反序列化和解释。这需要数据是自描述的,并且反序列化器必须处理缺失数据、多余数据和超出模式的数据。

exist试图在以下特性优化中解决这个问题

  • 易于使用的反序列化器读取接口:反序列化的数据可能远远超出模式,这可能会使用户处理起来冗长且容易出错。Exist将通过在模式类型上使用声明性注释来提供常见的模式,说明如何以及在哪里处理超出模式的数据。例如,对于每个字段,您可以选择如何处理它缺失或不有效的情况。您可以提供默认值(仅针对缺失的情况,或针对缺失或不有效的情况),将其公开为枚举(有效数据与反射式接口的联合,用于超出模式的数据,如果您想查看它),或者将包含该字段的父结构体标记为无效,并使用其策略来解决。这将通过生成读取接口的宏来实现。状态:未开始。
  • 紧凑:当大部分数据都在结构体中出现多次时,序列化的大小将接近内存大小,因为类型元数据将被去重,数据布局将与内存布局大致匹配。这是exist特别试图优于xml、json和protobuf等替代方案(具有可选字段)的一个领域。
  • 不需要集中式模式管理:如果多个小组分叉并独立扩展和编辑模式类型,则不会出现问题。字段和类型通过id号标识,但与protobuf标签不同,紧凑性不需要选择较小的值。ID为128位,因此是UUID的超集,因此可以使用随机UUID来避免ID冲突的风险。故意的冲突和/或具有冲突的恶意文档也不会破坏任何内容。
  • 高效的编码和解码:模式类型中的类型信息将被用于生成编码模板。这作为压缩模式,可以去除类型元数据而不必真正寻找冗余以进行压缩。它还允许选择与结构体内存布局匹配的压缩格式,以便在模式类型匹配时实现快速路径编码和解码,同时仍然允许所有文档在不匹配的情况下解码。这将在许多情况下实现零拷贝解码。

非目标

  • 人类可读的格式:如果您想这样做,请使用类似json或xml的东西。
  • 良好的数据压缩:exist only尝试压缩用于自描述所需的类型元数据。它可以扩展为执行数据压缩,或者输出可以通过通用压缩程序处理,但这些操作超出了此项目的目标范围。

潜在的未来功能

  • 扩展读取器接口以支持编辑和重新导出,以便在读取、编辑和覆盖过程中持久化当前应用程序在读取、编辑和覆盖过程中不需要或理解的数据(例如:更新文档)。
  • 可扩展的合同系统:即使在类型匹配的情况下,也能检测到无效的数据。这将允许使用超出模式的数据支持来处理任何可检查约束的违规。这可能是一个有用的独立库,但需要分层构建,以便可以与基于类型的部分组合。
  • 格式转换器/更新器:允许向读取器提供一些替代格式(它可以通过枚举公开)以及可选的转换器,这允许处理替代格式而无需在读取器接口中公开它们。

依赖项

~1.7–2.6MB
~58K SLoC