Change (de)serialization order of versioning and base classes

This allows deserializing the first base class on its own, even then the
derived class has been serialized. That makes sense if the full object (of
the derived class) should be stored but sometimes only the "base fields"
(of the base class) are needed.
This commit is contained in:
Martchus 2022-05-28 18:46:21 +02:00
parent 5c7a6cba8c
commit 2b0048f144
1 changed files with 8 additions and 8 deletions

View File

@ -246,6 +246,10 @@ void BinarySerializationCodeGenerator::generate(std::ostream &os) const
// print writeCustomType method
os << "template <> " << visibility << " void writeCustomType<::" << relevantClass.qualifiedName
<< ">(BinarySerializer &serializer, const ::" << relevantClass.qualifiedName << " &customObject, BinaryVersion version)\n{\n";
os << " // write base classes\n";
for (const RelevantClass *baseClass : relevantBases) {
os << " serializer.write(static_cast<const ::" << baseClass->qualifiedName << " &>(customObject), version);\n";
}
if (!relevantClass.relevantBase.empty()) {
os << " // write version\n"
" using V = Versioning<"
@ -255,10 +259,6 @@ void BinarySerializationCodeGenerator::generate(std::ostream &os) const
" serializer.writeVariableLengthUIntBE(V::applyDefault(version));\n"
" }\n";
}
os << " // write base classes\n";
for (const RelevantClass *baseClass : relevantBases) {
os << " serializer.write(static_cast<const ::" << baseClass->qualifiedName << " &>(customObject), version);\n";
}
os << " // write members\n";
auto mt = MemberTracking();
for (clang::Decl *const decl : relevantClass.record->decls()) {
@ -306,6 +306,10 @@ void BinarySerializationCodeGenerator::generate(std::ostream &os) const
mt = MemberTracking();
os << "template <> " << visibility << " BinaryVersion readCustomType<::" << relevantClass.qualifiedName
<< ">(BinaryDeserializer &deserializer, ::" << relevantClass.qualifiedName << " &customObject, BinaryVersion version)\n{\n";
os << " // read base classes\n";
for (const RelevantClass *baseClass : relevantBases) {
os << " deserializer.read(static_cast<::" << baseClass->qualifiedName << " &>(customObject), version);\n";
}
if (!relevantClass.relevantBase.empty()) {
os << " // read version\n"
" using V = Versioning<"
@ -317,10 +321,6 @@ void BinarySerializationCodeGenerator::generate(std::ostream &os) const
<< "\");\n"
" }\n";
}
os << " // read base classes\n";
for (const RelevantClass *baseClass : relevantBases) {
os << " deserializer.read(static_cast<::" << baseClass->qualifiedName << " &>(customObject), version);\n";
}
os << " // read members\n";
for (clang::Decl *const decl : relevantClass.record->decls()) {
// check static member variables for version markers