[Haskell-cafe] The state of binary (de)serialization
Nicolas Trangez
nicolas at incubaid.com
Thu Feb 28 11:49:11 CET 2013
On Mon, 2013-02-25 at 11:59 -0800, Johan Tibell wrote:
> On Mon, Feb 25, 2013 at 4:30 AM, Nicolas Trangez <nicolas at incubaid.com>wrote:
>
> > - cereal supports chunk-based 'partial' parsing (runGetPartial). It
> > looks like support for this is introduced in recent versions of 'binary'
> > as well (runGetIncremental)
> >
>
> Yes. Binary now support an incremental interface. We intend to make sure
> binary has all the same functionality as cereal. We'd like to move away
> from having two packages if possible and since binary has the larger
> installed user base we're trying to make that the go-to package.
This will certainly make things more obvious (and maybe ready for HP
inclusion?).
> > - cereal can output a strict bytestring (runPut) or a lazy one
> > (runPutLazy), whilst binary only outputs lazy ones (runPut)
> >
>
> The lazy one is more general and you can use toStrict (from bytestring) to
> get a strict ByteString from a lazy one, without loss of performance.
Sure. Turned out I was using lazy bs' anyway so switched to 'binary' for
deserialization.
> > - Next to binary and cereal, there's bytestring's Builder interface for
> > serialization, and Simon Meier's "blaze-binary" prototype
> >
>
> Simon's builder (originally developed in blaze-binary) has been merged into
> the bytestring package. In the future binary will just re-export that
> builder.
I was referring to https://github.com/meiersi/blaze-binary
> > Overall: what's the advised future-proof strategy of handling binary
> > (de)serialization?
>
>
> Use binary or the builder from bytestring whenever you can. Since the
> builder in bytestring was recently added you might have to fall back to
> blaze-builder if you believe your users can't rely on the latest version of
> bytestring.
I switched to Builder for serialization. It seems to create 'more
strict' lazy bytestrings than the cereal based code (as in: cereal seems
to create a new Chunk whenever appending a lazy bytestring, whilst
Builder concats them into a single chunk, at least for the short strings
I've been using).
The Monoidal interface feels very natural, maybe even more natural than
the Monad interface of PutM in binary/cereal:
instance Argument a => Argument [a] where
put l = word32LE cnt <> s
where
(cnt, s) = foldr (\e (c, m) -> (c + 1, put e <> m)) (0, mempty) l
Thanks,
Nicolas
More information about the Haskell-Cafe
mailing list