Serialize native Nim types to strings, streams, or sockets.
There are two operations:
freeze[T](input: T; output: Socket or Stream or var string)
import frosty var data = someArbitraryDataFactory() handle = openFileStream("somefile", fmWrite) # write serialized data into the file handle freeze(data, handle) close handle
thaw[T](input: Socket or Stream or string; output: var T)
import frosty var data: SomeArbitraryType handle = openFileStream("somefile", fmRead) # read deserialized data from the file handle thaw(handle, data) close handle
freeze[T](input: T): string
thaw[T](input: Socket or Stream or string): T
import frosty # adhoc serialization and deserialization var brrr = freeze("my data") assert thaw[string](brrr) == "my data"
Frosty can handle cyclic data structures, but not memory graphs of extreme size -- you can exhaust the stack because our traversal is implemented via recursion. This will be solved soon.
The benchmark compares frosty to https://github.com/treeform/flatty for a few static datatypes -- flatty does not work with cast objects yet.
$ nimph clone disruptek/frosty
or if you're still using Nimble like it's 2012,
$ nimble install https://github.com/disruptek/frosty
--define:frostySorted=onto use Miran's
Socketsupport for platform reasons.
--define:frostyDebug=onto emit some debugging output.