The implementation of each class' serialization/deserialization is no longer passed within a macro. The implementation now lies within a template of form:
template <typename Stream, typename Operation>
inline size_t SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
/* CODE */
}
In cases when codepath should depend on whether or not we are just deserializing (old fGetSize, fWrite, fRead flags) an additional clause can be used:
bool fRead = ser_action.ForRead();
The IMPLEMENT_SERIALIZE macro will now be a freestanding clause added within class' body (similiar to Qt's Q_OBJECT) to implement GetSerializeSize, Serialize and Unserialize. These are now wrappers around the SerializationOp template.