如何使用Data.Binary和System.IO.Handle

时间:2017-04-06 16:24:13

标签: haskell

我尝试从T Handle反序列化h类型的某些数据。 TBinary个实例。有两个限制因素:

  1. 序列化数据的长度很难以序列化形式计算。
  2. h中有其他数据被代码的其他部分消耗。
  3. 这使得很难以(懒惰或严格)ByteString阅读内容并在Get T上运行ByteString

    有没有办法直接在Get T上投放Handle

1 个答案:

答案 0 :(得分:1)

使用hGetContents懒惰地将所有数据读入字节串,然后反序列化。

如果您的代码的其他部分在使用后需要访问句柄,那么您需要手动从句柄中读取字节,直到您能够确定您感兴趣的部分的结束位置。 (有关详细信息,请参阅hGetContents的实现)之后,您可以停止读取字节并将句柄传递给程序的任何部分。

请注意,在代码中使用一个位置(线程?)从句柄反序列化/解析然后取消结果,而不是绕过句柄本身可能是更好的设计。如果这样做,您可以使用hGetContents并将所有反序列化代码保存在一个位置。如果你在整个代码中经常使用它,你也可以考虑将读/写句柄包装成monad变换器/免费monad效果。