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