TProtoClass: a persistent TClass. Add a dictionary and it will be able to do I/O.
Fill a TProtoClass from a TClass.
Store TProtoClasses in ROOT PCMs.
Do not store the TClass's checksum.

It must be calculated because of side effects. We do know the numerical result,
but we must deal with the other valid values that also need to be recalculated
from the data members.
Make TBaseClass persistent, caching the offset and properties.

Still lacks custom Streamer().
Set TClass data from a TProtoClass.
Add SetClass(), make persistent.
Initialize fields; implement Delete() for unused TProtoClasses.
Delete the collection of TProtoClasses after they have been written.
Enable for I/O (custom streamer).
Use new dict for TDictionary; stream TOptionListItem.
Implement streaming of TDataMember.

It will read the cached values and pre-calculated names.
Add a new mode to Init() which initializes the relevant parts (e.g. fDataType)
from these cached values.
The list of options is streamed automcatically and does not need to be rebuilt
by Init(true).
Implement streaming a TBaseClass.

Cache also TBaseClass::IsSTLContainer(); it needs fInfo otherwise.
Also set the TNamed / TObject part of / from TProtoClass.
Add protection against missing CodeGen.
Build the lists before filling TProtoClass.
Add default ctor; avoid alloc in ctor.
Call the proper base class streamer!
Base streaming is done by *ClassBuffer().
Move TProtoClass functions into TProtoClass.cxx; add TProtoRealData.

TRealData is now stored in a new structure TProtoClass::TProtoRealData.
Its list is stored as a series of these objects, separated by TObjStrings
that signal a new parent TClass for the data members. It is only reconstructed
when building the target TClass, not when reading the TProtoClass.