MyNixOS website logo
Description

Serialization library for GHC.

This package provides Haskell data serialisation independent of evaluation, by accessing the Haskell heap using foreign primitive operations. Any Haskell data structure apart from mutable data structures (MVars and TVars) can be serialised and later deserialised during the same run, or loaded into a new run, of the same program (the same executable file).

The library provides operations to serialize Haskell heap data, and to deserialize it:

trySerializeWith :: a -> Int -> IO (Serialized a) -- Int is maximum buffer size to use
trySerialize :: a -> IO (Serialized a)            -- uses default (maximum) buffer size
deserialize :: Serialized a -> IO a

The data type Serialized a is an opaque representation of serialised Haskell data (it contains a ByteArray). A phantom type a ensures type safety within the same program run. Type a can be polymorphic (at compile time, that is) when Serialized a is not used apart from being argument to deserialize. When data are externalised (written to disk or communicated over the network) using the provided instances of Binary or Read and Show, a needs to be monomorphic because they require Typeable context. The instances for Show and Read satisfy read . show == id.

Packman serialisation is orthogonal to evaluation, heap data are serialised in their current state of evaluation, they might be entirely unevaluated (a thunk) or only partially evaluated (containing thunks). Therefore, there can be cases where a mutable data structure is captured by a thunk, and lead to serialisation failures (typically related to lazy I/O).

The serialisation routine will throw a PackException if an error occurs inside the C code which accesses the Haskell heap, if a mutable data structure is serialised, or if the serialised data is too large. In presence of concurrent threads, another thread might be evaluating data referred to by the data to be serialised. In this case, the calling thread will block on the ongoing evaluation and continue when evaluated data is available. Internally, there is a PackExceptionP_BLACKHOLE to signal the condition, but it is hidden inside the core library

Metadata

Version

0.5.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows