我正在开发一个 Haskell 应用程序,该应用程序在使用 GHCJS 编译的浏览器中运行,该应用程序通过 websockets 与同样用 Haskell 编写的服务器通信。两个程序共享相同的 Haskell 数据类型定义,我“只是”必须选择序列化格式。
目前,为简单起见,程序在 Read
上运行。和 Show
,这可行,但显然并不理想。
另一方面,尚不清楚快速序列化的常用竞争者,例如 cereal
图书馆,在 ByteStrings
上工作实际上在 GHCJS 中会很有效率。此外,GHCJS 的 API 似乎很难让 ByteStrings
与二进制 Blob
交互JavaScript 绑定(bind)到 Websocket 提供的类型。
通用代码生成(使用 GHC.Generics
)会很好。
以前有没有人解决过这个问题?甚至可能对 GHCJS 上的各种序列化变体进行基准测试?
最佳答案
去年我们在 Haskell 中寻找一个快速的序列化器/反序列化器库来将数据存储在 reddis 缓存中,最终我们最终使用了 ProtoBuf!这部分是因为我们已经拥有了我们想要序列化的所有对象的 ProtoBuf 实现,但与 Cereal /二进制相比,性能也好得多。到时候,store是不存在的。
序列化/反序列化的大小和速度也很大程度上取决于您的数据。例如,如果你有很多小的(比如在 1 到 100 范围内)64 位数字,protobuf(因为它的 base 128 variant 编码)甚至 JSON 可能比 Cereal 或二进制(我猜使用固定数字的大小,无论其值如何)。
还有Typed-Wire这允许您跨几种语言进行序列化,但我认为它使用 JSON 作为底层实现。
我没有使用 GHCJS 的经验,但我建议尝试 store
第一的。只要确保客户端和服务器没有小/大字节序不兼容。
关于haskell - Websockets 上 GHCJS 代码最有效的有线格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41007007/