最小测试代码(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)是如何来自的。
答案 0 :(得分:1)
根据我的评论,输出的解释是当前用于序列化Binary
的格式ByteString
是将长度输出为64位整数,后跟{{{}}的内容1}}。
但一般来说,ByteString
类的用途有限。不保证向前或向后兼容性,甚至不允许模式演化的机制,没有允许跨语言互操作性的实例的标准或规范。如果您想要一个不透明的二进制blob,它只会暂时存储和/或与您具有高级别控制权的节点进行通信,那么它才真正有用。作为消费者,这是您对Binary
实例的所有期望。虽然没有理由不为您创建序列化代码的类型创建Binary
实例,但如果您提供超出上述范围的任何保证,您应该(也)将其与Binary
类分开呈现。理想情况下,作为传达这些额外保证的某类的实例,例如,用于序列化为特定格式的类,例如Avro。
所有这些仅针对Binary
课程。 Binary
包的其余部分对于其预期目的非常有用。