From 2b0048f14444f74f538faaa6e5dec44123486512 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sat, 28 May 2022 18:46:21 +0200 Subject: [PATCH] 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. --- generator/binaryserializationcodegenerator.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/generator/binaryserializationcodegenerator.cpp b/generator/binaryserializationcodegenerator.cpp index 859dbfe..3746fb2 100644 --- a/generator/binaryserializationcodegenerator.cpp +++ b/generator/binaryserializationcodegenerator.cpp @@ -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_castqualifiedName << " &>(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_castqualifiedName << " &>(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