8

我正在开发一个 Haskell 应用程序,该应用程序在使用 GHCJS 编译的浏览器中运行,该应用程序通过 websockets 与同样用 Haskell 编写的服务器通信。两个程序共享相同的 Haskell 数据类型定义,我“只是”必须选择序列化格式。

目前,为简单起见,程序在Readand上运行Show,它可以工作,但显然并不理想。

另一方面,目前还不清楚快速序列化的常用竞争者,例如cereal库,ByteStrings在 GHCJS 中是否真的有效。此外,GHCJS 的 API 似乎很难让与JavaScript 绑定到 Websockets 提供ByteStrings的二进制类型进行交互。Blob

通用代码生成(使用GHC.Generics)会很好。

以前有没有人解决过这个问题?甚至可能对 GHCJS 上的各种序列化变体进行基准测试?

4

1 回答 1

1

去年我们在 Haskell 中寻找一个快速的序列化器/反序列化器库来将数据存储在 reddis 缓存中,最终我们最终使用了 ProtoBuf!这部分是因为我们已经实现了我们想要序列化的所有对象的 ProtoBuf,但与谷物/二进制相比,性能也好得多。到那时,商店不存在。

序列化/反序列化的大小和速度也很大程度上取决于您的数据。例如,如果你有很多小的(比如在 1 到 100 范围内)64 位数字,protobuf(因为它的基本 128 变体编码)甚至 JSON 可能比谷物或二进制更有效(我猜使用固定数字的大小,无论其值如何)。

还有Typed-Wire允许您跨几种语言进行序列化,但我认为它使用 JSON 作为底层实现。

我没有使用 GHCJS 的经验,但我建议store先尝试。只要确保客户端和服务器没有小/大字节序不兼容。

于 2016-12-07T01:22:45.847 回答