packman: 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 (MVar
s
and TVar
s) 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 PackException
P_BLACKHOLE
to signal the
condition, but it is hidden inside the core library
Flags
Manual Flags
Name | Description | Default |
---|---|---|
debug | Enable debug support | Disabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- packman-0.5.0.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
Versions [RSS] | 0.3.0, 0.4.0, 0.5.0 |
---|---|
Dependencies | array (>=0.5), base (>=4.7 && <5), binary (>=0.7), bytestring (>=0.10), ghc-prim (>=0.3), primitive (>=0.5) [details] |
Tested with | ghc ==7.8.2, ghc ==7.8.3, ghc ==7.10.2, ghc ==8.0.2, ghc ==8.2.1, ghc ==8.2.2 |
License | BSD-3-Clause |
Author | Michael Budde, Ásbjørn V. Jøkladal, Jost Berthold |
Maintainer | jost.berthold@gmail.com |
Category | Serialization, Data, GHC |
Source repo | head: git clone https://github.com/jberthold/packman.git |
Uploaded | by JostBerthold at 2018-01-19T09:45:58Z |
Distributions | |
Reverse Dependencies | 2 direct, 3 indirect [details] |
Downloads | 5289 total (11 in the last 30 days) |
Rating | (no votes yet) [estimated by Bayesian average] |
Your Rating | |
Status | Docs available [build log] Last success reported on 2018-01-19 [all 1 reports] |