在Haskell中读取和显示是否有更好的替代方案?

时间:2014-08-26 01:24:42

标签: haskell serialization

我正在编写一个网络原型,其中ServerWorld的状态传输到其所有Clients。我使用以下工作流程执行此操作:

Server --> World --> show --> ByteString --> GZip.compress   --> udp send
Client <-- World <-- read <-- ByteString <-- GZip.decompress <-- udp receive

但是,showread似乎是性能瓶颈 - 占用了大部分时间。随着World的增长,这只会是一个巨大的挑战。

我知道我必须在某个时候停止发送整个世界,但有没有其他方法可以使用readshow将数据结构转换为ByteString

1 个答案:

答案 0 :(得分:16)

我相信binary package为二进制格式提供非常有效的去/序列化。

编辑:请求了代码,这是(BSD3)文档中的Generic示例:

{-# LANGUAGE DeriveGeneric #-}

import Data.Binary
import GHC.Generics (Generic)

data Foo = Foo
         deriving (Generic)

-- GHC will automatically fill out the instance
instance Binary Foo

然后你可以,例如使用encode代替showdecode代替read。请注意,该包具有其他一些可能有用的功能,并且可以自定义该格式。