Когда создается StructSeriliser, ему передается экземпляр объекта, соответствующий ему, и он создает сериализаторы для каждого поля:
StructSerialiser (T* data)
: SerialiserData (data)
{
if (fieldBinderList_.empty ())
Serialiser<T>::initialise ();
typedef FieldBinderList::const_iterator Iter;
for ( Iter iter = fieldBinderList_.begin ()
; iter != fieldBinderList_.end ()
; ++iter
)
{
serialisers_.push_back
( SerialiserEntry
( (*iter)->tags_
, (*iter)->createSerialiser (*data)
)
);
}
}
Затем, когда сериализатору передается начальный элемент, он передает его следующему соответствующему полевому сериализатору.
Если честно, оригинальный фрагмент кода не предназначен для самостоятельного использования. Полный код этого класса содержит более 500 строк, а также есть сериализаторы для примитивов, опций и вариантов выбора.