1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

Add mechanism to provide save compatibility if class is removed or

addded
This commit is contained in:
Ivan Savenko
2024-08-24 13:54:14 +00:00
parent c64dcfaa0f
commit ac271c09b9
3 changed files with 27 additions and 19 deletions

View File

@@ -92,18 +92,4 @@ public:
}
};
/// Compatibility for old code
class DLL_LINKAGE CTownCompatBuilding1 : public TownRewardableBuildingInstance
{
public:
using TownRewardableBuildingInstance::TownRewardableBuildingInstance;
};
/// Compatibility for old code
class DLL_LINKAGE CTownCompatBuilding2 : public TownRewardableBuildingInstance
{
public:
using TownRewardableBuildingInstance::TownRewardableBuildingInstance;
};
VCMI_LIB_NAMESPACE_END

View File

@@ -114,8 +114,6 @@ void registerTypes(Serializer &s)
s.template registerType<OppositeSideLimiter>(51);
s.template registerType<TownBuildingInstance>(52);
s.template registerType<TownRewardableBuildingInstance>(53);
s.template registerType<CTownCompatBuilding1>(54);
s.template registerType<CTownCompatBuilding2>(55);
s.template registerType<CRewardableObject>(56);
s.template registerType<CTeamVisited>(57);
s.template registerType<CGObelisk>(58);

View File

@@ -12,7 +12,6 @@
#include "BinaryDeserializer.h"
#include "BinarySerializer.h"
#include "CTypeList.h"
#include "RegisterTypes.h"
@@ -36,12 +35,34 @@ public:
void savePtr(BinarySerializer &s, const Serializeable *data) const override
{
const Type *ptr = dynamic_cast<const Type*>(data);
//T is most derived known type, it's time to call actual serialize
const_cast<Type*>(ptr)->serialize(s);
}
};
template<typename Type, ESerializationVersion maxVersion>
class SerializerCompatibility : public ISerializerReflection
{
public:
Serializeable * createPtr(BinaryDeserializer &ar, IGameCallback * cb) const override
{
return ClassObjectCreator<Type>::invoke(cb);
}
void savePtr(BinarySerializer &s, const Serializeable *data) const override
{
throw std::runtime_error("Illegal call to savePtr - this type should not be used for serialization!");
}
};
class SerializerCompatibilityBonusingBuilding final : public SerializerCompatibility<TownRewardableBuildingInstance, ESerializationVersion::NEW_TOWN_BUILDINGS>
{
void loadPtr(BinaryDeserializer &ar, IGameCallback * cb, Serializeable * data) const override
{
auto * realPtr = dynamic_cast<TownRewardableBuildingInstance *>(data);
realPtr->serialize(ar);
}
};
template<typename Type>
void CSerializationApplier::registerType(uint16_t ID)
{
@@ -52,6 +73,9 @@ void CSerializationApplier::registerType(uint16_t ID)
CSerializationApplier::CSerializationApplier()
{
registerTypes(*this);
apps[54].reset(new SerializerCompatibilityBonusingBuilding);
apps[55].reset(new SerializerCompatibilityBonusingBuilding);
}
CSerializationApplier & CSerializationApplier::getInstance()