高性能对象序列化库,支持总和类型。

8

我想知道是否有任何高性能序列化库(如Google协议缓冲区)支持总和类型

总和类型是带标记的联合,基本上就是能够说某个东西是A、B或C中的一个。总和类型在支持代数数据类型的语言中使用,例如Haskell和ML。

3个回答

2
如果你所说的“像Google协议缓冲区一样”的意思是能够为多种语言生成代码,那么可能不存在这样的东西。在不支持它们的语言中模拟总和类型最好也很尴尬(例如尝试在boost:variant上进行模式匹配)。因此,如果主要目标是主流语言,则将它们排除在外是有意义的。
如果你只想使用Haskell / OCaml / 任何其他语言,那么有很多选择。对于Haskell,有cerealbinarysafecopy等选项。对于OCaml,有piqi项目

1
你不需要模式匹配,只需要标记联合。另一个例子是具有3个可选字段的protobuf,并且有一个约束条件,即一次只能设置其中一个字段。我主要寻找跨平台支持一些主流语言,如C ++,Java或者Python。 - user239558
我认为在没有模式匹配的情况下,sum类型是不切实际的(但并非不可能)。使用可选字段是脆弱的,因为通常无法强制执行约束。预期可以连接消息,并且约束可能会在连接期间被破坏。 - Shimuuar

2
我不知道除了Piqi(我是作者)之外还有支持和并类型的实用系统。Piqi与Protocol Buffers兼容,并原生支持OCaml和Erlang。Protocol Buffers中缺少和并类型是我创建Piqi的原因之一。
我的计划是扩展Piqi以支持其他语言,如Haskell、Clojure等。

0

是否需要一种“高性能”格式?许多通用格式应该能够简单地使用现有的结构,特别是Maps/哈希表,来支持联合(只需包含一个键表示实际值类型的条目)。 因此,也许您可以使用简单的约定来传输这样的内容,比如使用JSON。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接