[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