supports saving and restoring pointers.
supports pointer aliasing, ie, if you write the same pointer twice, both pointers are restored on loading; the data that the pointers point to, however, are written only once.
supports object graphs, even those with circular references, that is, pointers that create a cycle of object references, eg, object A points to object B which points to object C which points back to object A.
supports serializing polymorphic types on both a global and a type-by-type basis. Clients can globally disable polymorphic support (via a template parameter) or they can disable polymorphic support on a type-by-type basis (via a template specialization). In other words, the client can decide how to serialize the data that a pointer (or a pointer wrapper such as std::auto_ptr<>) points to: in particular, if it points to a polymorphic type, clients may choose to serialize the actual type's data (polymorphic support enabled), or to serialize the static type's data (polymorphic support disabled). For example, if class D derives from B, then a pointer of type B* that actually points to an instance of D can serialize as D (the actual type) or as B (the static type).
on loading a pointer, clients can customize the pointer
allocation by specializing the
ccs::serialization::reallocate_pointer<T>()
and
ccs::serialization::deallocate_pointer<T>()
functions.