Sockets 如何在Haskell中序列化/反序列化通过网络发送的对象?
我发现有很多方法可以序列化/反序列化Haskell对象:Sockets 如何在Haskell中序列化/反序列化通过网络发送的对象?,sockets,haskell,serialization,Sockets,Haskell,Serialization,我发现有很多方法可以序列化/反序列化Haskell对象: Data.Serialize->encode,decode函数 数据二进制 MsgPack、JSON、BSON等 在我的应用程序中,我想设置一个简单的TCP客户机服务器,客户机可以在其中发送序列化的Haskell记录对象。如何在这些序列化备选方案之间做出决定 此外,当序列化为字符串的对象通过网络使用发送时,将返回字符串。是否有一个稍微高一点的库,可以在整个TCP消息级别工作?换句话说,有没有一种方法可以避免在接收端编写解析代码: 收
- Data.Serialize->encode,decode函数
- 数据二进制
- MsgPack、JSON、BSON等
- 收集一系列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库。希望其他人能对此有更深入的了解。至于你问题的第二部分,需要做两件事:
(当然,另一种选择是在每条消息的前面加上其长度,即只读的确切字节数。)谢谢,您和danidiaz的答案都很有用。