### `pickle.dumps(obj) -> bytes`

Return the pickled representation of an object as a bytes object.

### `pickle.loads(b: bytes)`

Return the unpickled object from a bytes object.

## What can be pickled and unpickled?

The following types can be pickled:

- [x] None, True, and False;
- [x] integers, floating-point numbers;
- [x] strings, bytes;
- [x] tuples, lists, sets, and dictionaries containing only picklable objects;
- [x] functions (user-defined) accessible from the top level of a module (using def, not lambda);
- [x] classes accessible from the top level of a module;
- [x] instances of such classes

`array2d` instances cannot be pickled. Calling `pickle.dumps()` on an `array2d`
raises `TypeError`. Previously pickled `array2d` data is no longer supported.

Cyclic and shared references are preserved: `list`, `dict` and instances of
python classes are memoized before their contents are written, so an object
graph containing reference cycles round-trips correctly and object identity
is retained. A cycle that passes only through a `tuple` or through a
`__reduce__` result is not supported.

The following magic methods are available:

- [ ] `__getnewargs__`
- [ ] `__getstate__`
- [ ] `__setstate__`
- [x] `__reduce__`
