Haskell 中的序列化

Serialization in Haskell

从鸟瞰来看,我的问题是:Haskell中是否有通用的as-is数据序列化机制?

简介

问题的根源确实不在Haskell。有一次,我试图序列化一个 python 字典,其中对象的哈希函数非常繁重。我发现在python中,默认的字典序列化并没有保存字典的内部结构,只是转储了一个键值对列表。结果,反序列化过程很耗时,也没有办法纠缠。我确信 Haskell 中有一种方法,因为在我看来,使用 BFS 或 DFS 自动将纯 Haskell 类型传输到字节流应该没有问题。令人惊讶的是,但事实并非如此。这个问题已被讨论 here(引用如下)

Currently, there is no way to make HashMap serializable without modifying the HashMap library itself. It is not possible to make Data.HashMap an instance of Generic (for use with cereal) using stand-alone deriving as described by @mergeconflict's answer, because Data.HashMap does not export all its constructors (this is a requirement for GHC). So, the only solution left to serialize the HashMap seems to be to use the toList/fromList interface.

当前问题

我和 Data.Trie bytestring-trie package 有完全相同的问题。为我的数据构建一个 trie 非常耗时,我需要一种机制来序列化和反序列化这个轮胎。但是,它看起来像以前的情况,我看不出如何使 Data.Trie 成为 Generic 的实例(或者,我错了吗)?

所以问题是:

  1. 是否有某种通用机制可以将纯 Haskell 类型投影到字节字符串?如果不是,这是基本限制还是只是缺乏实现?

  2. 如果不是,修改 bytestring-trie package 使其成为 Generic 的实例并使用 Data.Store

    序列化的最轻松的方法是什么
  1. 有一种方法使用compact regions,但有一个很大的限制:

Our binary representation contains direct pointers to the info tables of objects in the region. This means that the info tables of the receiving process must be laid out in exactly the same way as from the original process; in practice, this means using static linking, using the exact same binary and turning off ASLR. This API does NOT do any safety checking and will probably segfault if you get it wrong. DO NOT run this on untrusted input.

这也让我们深入了解目前无法实现通用序列化。数据结构包含非常具体的指针,如果您使用不同的二进制文件,这些指针可能会有所不同。将原始字节读入另一个二进制文件将导致无效指针。

有一些关于削弱此要求的讨论in this GitHub issue

  1. 我认为正确的方法是在 internal module. That is what happened with HashMap which is now fully accessible in its internal module.
  2. 中打开问题或拉取请求上游导出数据构造函数

更新:好像已经有类似的open issue了。