套接字 – 如何序列化/反序列化在Haskell中通过网络发送的对象?

我看到有很多方法可以序列化/反序列化
Haskell对象:

> Data.Serialize – >编码,解码功能
> Data.Binary http://code.haskell.org/binary/
> MsgPack,JSON,BSON等

在我的应用程序中,我想设置一个简单的TCP客户端服务器,其中客户端可以发送序列化的Haskell记录对象.如何在这些序列化替代品之间做出决定?

此外,当使用Network.Socket通过网络发送序列化为字符串的对象时,将返回字符串.是否有一个稍高级别的库,它在整个TCP消息的级别上工作?换句话说,有没有办法避免在接收端编写解析代码:

>收集一系列recv()调用的结果,
>检测到已收到整个对象,并且
>然后将其解析为haskell类型?

在我的应用程序中,预计对象不会太大(可能大约约1MB).

最佳答案 至于你问题的第二部分,需要做两件事:

>增量解析器,它不需要将整个文档放在内存中以开始解析,并且可以使用从线路到达的部分数据块来提供.此外,当解析成功时,它必须返回任何“剩余数据”以及解析的值.
>具有“推回功能”的数据源,允许您“读取”任何剩余部分,以便它们可用于下一次解析尝试.

提供(1)的最流行的库是attoparsec.对于(2),所有三个主流媒体库(conduit,io-streamspipes)都提供某种推回功能(后者使用辅助pipes-parse包).所有三个库也可以与attoparsec解析器集成(参见here,herehere).

(当然,另一个选择是在每个消息前面加上它的长度只读取确切的字节数.)

点赞