# 21 Persistent Values: `Pickle`

The `Pickle` module provides procedures to store and retrieve stateless values on persistent storage.

`save`

  > > `{Pickle.save` `+X``` `+PathV``}`

  Stores `X` in a file named `PathV`.

  Note that `X` can be any stateless value. So it is possible to save for example records, procedures or classes. However an exception is raised if for example `X` contains an object or a logic variable.

`saveCompressed`

  > > `{Pickle.saveCompressed` `X``` `+PathV``` `+LevelI``}`

  Works like `save` but additionally compresses its output. `LevelI` is an integer between `0` and `9` specifying the compression level: the higher the value the better the compression factor, but the longer compression takes. A value of `0` gives no compression, so `{Pickle.save X Value}` is equivalent to `{Pickle.saveCompressed X Value 0}`.

  Compression time and ratio depend on the type of input. The compression ratio might vary between 20 and 80 percent, while compression at level 9 is usually less than 2 times slower than using no compression.

`saveWithHeader`

  > > `{Pickle.saveWithHeader` `X``` `+PathV``` `+HeaderV``` `+LevelI``}`

  This procedure is a generalization of the above builtins. It saves `X` in file `+PathV` with compression level `+LevelI` and additionally prepends the virtual string `HeaderV` at the beginning. So `HeaderV` can be used for example to prepend a comment in front of the pickle or to prepend a shell startup script to load and execute the pickle.

`loadWithHeader`

  > > `{Pickle.loadWithHeader` `+UrlV``` `?Pair``}`

  This procedure retrieves a value from URL `UrlV` that has been previously saved with one of the above procedures. It returns a pair `HeaderV``#``Value`, where `HeaderV` is the (possibly empty) header and `Value` the value that was retrieved.

`load`

  > > `{Pickle.load` `+UrlV``` `?Value``}`

  This is just a shortcut for

  > `{Pickle.loadWithHeader` `UrlV``_#``Value``}`

`pack`

  > > `{Pickle.pack` `+X``` `?ByteString``}`

  Takes a value `X` and pickles it to a bytestring.

`unpack`

  > > `{Pickle.unpack` `+PickleV``` `?Value``}`

  Unpacks a virtual string `PickleV` that has created by pickling (e.g., by `Pickle.pack`).

  `Pickle.unpack` may crash the Oz Engine if given a corrupt pickle.