[Haskell-cafe] ANNOUNCE: binary: high performance,
pure binary serialisation
Donald Bruce Stewart
dons at cse.unsw.edu.au
Fri Jan 26 18:27:18 EST 2007
john:
> On Fri, Jan 26, 2007 at 04:42:48PM +0100, Tomasz Zielonka wrote:
> > I also have to use a specific serialisation format. I guess we could
> > both simply use putWord8, but then we'll probably lose most of the
> > benefits of using the library.
> >
> > Perhaps we could think about introducing some "encoding contexts", with
> > a default encoding that can be automatically derived, but also with the
> > ability to create one's own encodings?
>
> one can use newtypes they would be faster in any case, I was thinking
> something like:
>
>
> > newtype XDRInt = XDRInt Int
> > newtype XDRSTring sz = ...
>
> and so forth, now if you build up a structure
>
> > data NfsSattr = NfsSattr {
> > mode :: XdrUnsigend, -- protection mode bits
> > uid :: XdrUnsigned, -- owner user id
> > gid :: XdrUnsigned, -- owner group id
> > size :: XdrUnsigned, -- file size in bytes
> > atime :: XdrNfsTime, -- time of last access
> > mtime :: XdrNfsTime -- time of last modification
> > }
>
> now you can speak nfs directly by serializing right from and to your
> socket! :) a whole filesystem implemented in haskell in not so many
> lines. very nice.
>
> actually, I probably will write Data.Binary.Protocol.Xdr (better
> location?). I actually do have a NFS server written in haskell in a much
> more clunky way I could revive.
>
> now, the only new primitives I would need are:
>
> > alignTo :: Word8 -> Int -> Put
> > alignTo _ _ = ...
> >
> > setAlignment :: Int -> Put
> > setAlignment _ = ...
>
> where alignTo would output some number of bytes in order to bring the
> stream to the next alignment boundry specified, and setAlignment would
> force the current alignment to be some value, without outputing any
> bytes. Would these be doable? They would open up a lot of possibilities.
I think a StateT over Put/Get that carries around a count of the bytes
written, and the alignment, could be used. In general we envisage monad
transformers over Get/Put for adding things like bitwise writes, aligned
writes and so on.
-- Don
More information about the Haskell-Cafe
mailing list