通过websockets实现GHCJS代码的最有效的线格式

时间:2016-12-06 23:46:32

标签: haskell serialization websocket ghcjs

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

目前,为简单起见,该程序在ReadShow上运行,这有效,但显然不理想。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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