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