Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何在Haskell中序列化/反序列化通过网络发送的对象?_Sockets_Haskell_Serialization - Fatal编程技术网

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

Sockets 如何在Haskell中序列化/反序列化通过网络发送的对象?,sockets,haskell,serialization,Sockets,Haskell,Serialization,我发现有很多方法可以序列化/反序列化Haskell对象: Data.Serialize->encode,decode函数 数据二进制 MsgPack、JSON、BSON等 在我的应用程序中,我想设置一个简单的TCP客户机服务器,客户机可以在其中发送序列化的Haskell记录对象。如何在这些序列化备选方案之间做出决定 此外,当序列化为字符串的对象通过网络使用发送时,将返回字符串。是否有一个稍微高一点的库,可以在整个TCP消息级别工作?换句话说,有没有一种方法可以避免在接收端编写解析代码: 收

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

  • Data.Serialize->encode,decode函数
  • 数据二进制
  • MsgPack、JSON、BSON等
在我的应用程序中,我想设置一个简单的TCP客户机服务器,客户机可以在其中发送序列化的Haskell记录对象。如何在这些序列化备选方案之间做出决定

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

  • 收集一系列recv()调用的结果
  • 检测是否已接收到整个对象,以及
  • 然后将其解析为haskell类型

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

要回答问题的第一部分(关于数据序列化),我想说您列出的所有内容听起来都不错。由于您正在处理相当大(1MB)的序列化,我认为最重要的是懒惰。还有另一个序列化库,名为
grane
,它具有严格的序列化,您不希望这样做,因为在发送之前需要在内存中构建它。我将向aeson()发出一声呐喊,您可以使用GHC泛型来获得如下简单内容:

data Shape = Rect Int Int | Circle Double | Other String Int
  deriving (Generic)
instance FromJSON Shape  -- uses a default
instance ToJSON Shape    -- uses a default

然后,砰!,您可以访问
编码
解码
方法。我不知道更高级别的TCP库。希望其他人能对此有更深入的了解。

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

  • 一种增量解析器,它不需要在内存中保存整个文档就可以开始解析,并且可以从网络中获取部分数据块。此外,当解析成功时,它必须返回任何“剩余数据”以及解析后的值

  • 一种具有“回推功能”的数据源,允许您“未读”任何剩余内容,以便下一次解析尝试可以使用它们

  • 最受欢迎的图书馆(1)是。至于(2),所有三个主要的流媒体库(、和)都提供了某种推送功能(后者使用辅助包)。这三个库也可以与attoparsec解析器集成(请参阅和)


    (当然,另一种选择是在每条消息的前面加上其长度,即只读的确切字节数。)

    谢谢,您和danidiaz的答案都很有用。