2016-02-08 2 views
1

code de test minimal (bs.hs):Comment générer un binaire minimal en utilisant Data.Binary et 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 

Et je reçois:

% 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 

je me attends à obtenir "xxx". Je n'ai aucune idée de comment viennent les 8 premiers octets (7 x \ 0 + 1 x 003).

+3

La longueur du ByteString est un nombre de 64 bits (8 octets). Si vous voulez un format spécifique pour votre sortie, vous ne devriez pas utiliser la classe binaire. –

+0

Après avoir relu la documentation, cela a du sens. J'ai commencé à regarder Data.Binary.Get et Data.Binary.Put mais j'ai fini par utiliser Data.Binary. – uebayasi

+0

@DerekElkins depuis votre commentaire a répondu à la question, vous devriez le fournir comme une réponse ... – sclv

Répondre

1

De mon commentaire, l'explication de la sortie est que le format Binary utilise actuellement pour sérialisation ByteString s est à la sortie de la longueur comme un entier de 64 bits suivi par le contenu du ByteString.

Généralement, cependant, la classe Binary est d'utilisation limitée. Il n'y a aucune garantie de compatibilité ascendante ou descendante, pas de mécanisme permettant même l'évolution du schéma, pas de norme ou de spécification pour les instances permettant l'interopérabilité inter-langues. Ce n'est vraiment utile que si vous voulez un blob binaire opaque que vous ne stockez que temporairement et/ou communiquez avec des nœuds sur lesquels vous avez un haut niveau de contrôle. En tant que consommateur, c'est tout ce que vous pouvez attendre d'une instance Binary. Bien qu'il n'y ait aucune raison de ne pas créer d'instance Binary pour un type pour lequel vous créez un code de sérialisation, si vous offrez des garanties au-delà de ce qui précède, vous devriez probablement le présenter séparément de la classe Binary. Idéalement, en tant qu'exemple d'une classe qui communique ces garanties supplémentaires, par ex. une classe pour la sérialisation vers un format spécifique tel que Avro.

Tout ceci est uniquement destiné à la classe Binary. Le reste du package binary est très utile pour son usage prévu.