如何使用Data.Binary和Data.ByteString.Lazy输出最小二进制文件?

时间:2016-02-08 01:40:58

标签: haskell bytestring

最小测试代码(bs.hs):

import qualified Data.Binary as B
import qualified Data.ByteString.Lazy.Char8 as BSLC

main = do
    BSLC.putStr $ B.encode $ Pad $ BSLC.pack "xxx"

data Pad = Pad BSLC.ByteString
instance B.Binary Pad where
    put (Pad p) = do
        B.put p
    get = do
        p <- B.get
        return $ Pad p

我得到了:

% runghc bs.hs | od -c
0000000   \0  \0  \0  \0  \0  \0  \0 003   x   x   x                    
0000013
% ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.2

我希望得到“xxx”。我不知道前8个字节(7 x \ 0 + 1 x 003)是如何来自的。

1 个答案:

答案 0 :(得分:1)

根据我的评论,输出的解释是当前用于序列化Binary的格式ByteString是将长度输出为64位整数,后跟{{{}}的内容1}}。

但一般来说,ByteString类的用途有限。不保证向前或向后兼容性,甚至不允许模式演化的机制,没有允许跨语言互操作性的实例的标准或规范。如果您想要一个不透明的二进制blob,它只会暂时存储和/或与您具有高级别控制权的节点进行通信,那么它才真正有用。作为消费者,这是您对Binary实例的所有期望。虽然没有理由不为您创建序列化代码的类型创建Binary实例,但如果您提供超出上述范围的任何保证,您应该(也)将其与Binary类分开呈现。理想情况下,作为传达这些额外保证的某类的实例,例如,用于序列化为特定格式的类,例如Avro

所有这些仅针对Binary课程。 Binary包的其余部分对于其预期目的非常有用。