2016-02-08 35 views
1

最小的測試代碼(bs.hs):如何使用Data.Binary和Data.ByteString.Lazy輸出最小二進制文件?

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)是如何來的。

+3

它是ByteString的長度,是一個64位(8字節)的數字。如果你想要輸出一個特定的格式,你不應該使用Binary類。 –

+0

重新閱讀文檔後,有道理。 我開始看Data.Binary.Get和Data.Binary.Put,但以某種方式結束與使用Data.Binary。 – uebayasi

+0

@DerekElkins,因爲你的評論回答了這個問題,你應該提供它作爲答案... – sclv

回答

1

從我的評論,輸出的解釋是,目前使用的格式Binary序列化ByteString s是輸出長度爲一個64位整數,其次是ByteString的內容。

儘管如此,Binary類的用途有限。無法保證向前或向後的兼容性,甚至不允許架構演變的機制,也沒有標準或規範來允許跨語言的互操作性。如果你想要一個不透明的二進制blob,它只會暫時存儲和/或與你有很高控制權的節點通信。作爲消費者,這是您期望的Binary實例的全部。雖然沒有理由不爲您創建序列化代碼的類型創建Binary實例,但如果您提供了超出上述範圍的任何保證,那麼您應該(也)將其與Binary類分開提供。理想情況下,作爲傳達這些額外保證的一些類的實例,例如序列化爲特定格式的類,如Avro

所有這些只針對Binary類。 binary包的其餘部分對於其預期目的非常有用。

相關問題