static void serializeElement(MemoryBuffer & target, IDefRecordElement * elem) { byte kind = elem ? elem->getKind() : DEKnone; target.append(kind); switch (kind) { case DEKnone: break; case DEKrecord: { size32_t maxSize = elem->getMaxSize(); unsigned numChildren = elem->numChildren(); target.append(maxSize).append(numChildren); for (unsigned i=0; i < numChildren; i++) serializeElement(target, elem->queryChild(i)); break; } case DEKifblock: { IValue * value = elem->queryCompareValue(); serializeValue(target, value); serializeElement(target, elem->queryChild(0)); serializeElement(target, elem->queryChild(1)); break; } case DEKfield: { _ATOM name = elem->queryName(); ITypeInfo * type = elem->queryType(); size32_t maxSize = elem->getMaxSize(); serializeAtom(target, name); type->serialize(target); serializeElement(target, elem->queryChild(0)); target.append(maxSize); break; } default: throwUnexpected(); } }