haskell - Websockets 上 GHCJS 代码最有效的有线格式

标签 haskell serialization websocket ghcjs

我正在开发一个 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/

相关文章:

haskell - nix-shell 为 #! runghc 的解释器

c# - 如何仅对某些属性应用缩进序列化?

haskell - 格式化长模式匹配

c# - 什么是 [Serializable] 以及我应该何时使用它?

c# - 自定义 ASP.NET Web API 输出

websocket - 使用无服务器的自定义 api 网关 websocket 端点

java - Spring-websockets : Spring security authorization not working inside websockets

Asp.Net 作为客户端打开 websocket

haskell - 自然数序列生成器

linux - GLUT 键盘 react 迟钝