diff --git a/lib/binary/reflector-boosthana.h b/lib/binary/reflector-boosthana.h index fd57de2..fb54f05 100644 --- a/lib/binary/reflector-boosthana.h +++ b/lib/binary/reflector-boosthana.h @@ -30,7 +30,7 @@ template > *> void readCustom boost::hana::keys(customType), [&deserializer, &customType](auto key) { deserializer.read(boost::hana::at_key(customType, key)); }); } -template > *> void writeCustomType(BinarySerializer &serializer, const Type &customType) +template > *> void writeCustomType(BinarySerializer &serializer, const Type &customType, BinaryVersion version) { boost::hana::for_each( boost::hana::keys(customType), [&serializer, &customType](auto key) { serializer.write(boost::hana::at_key(customType, key)); }); diff --git a/lib/binary/reflector.h b/lib/binary/reflector.h index 32aedc9..312ff37 100644 --- a/lib/binary/reflector.h +++ b/lib/binary/reflector.h @@ -33,7 +33,9 @@ template struct AdaptedBinarySerializable : public Traits::Bool struct BinarySerializable; +using BinaryVersion = std::uint64_t; + +template struct BinarySerializable; /*! * \brief The BinaryReflector namespace contains BinaryReader and BinaryWriter for automatic binary (de)serialization. @@ -51,7 +53,7 @@ class BinaryDeserializer; class BinarySerializer; template > * = nullptr> void readCustomType(BinaryDeserializer &deserializer, Type &customType); -template > * = nullptr> void writeCustomType(BinarySerializer &serializer, const Type &customType); +template > * = nullptr> void writeCustomType(BinarySerializer &serializer, const Type &customType, BinaryVersion version = 0); class BinaryDeserializer : public CppUtilities::BinaryReader { friend class ::BinaryReflectorTests; @@ -90,7 +92,7 @@ public: template , Traits::HasSize> * = nullptr> void write(const Type &iteratable); template > * = nullptr> void write(const Type &enumValue); template > * = nullptr> void write(const Type &variant); - template > * = nullptr> void write(const Type &customType); + template > * = nullptr> void write(const Type &customType, BinaryVersion version = 0); private: std::unordered_map m_pointer; @@ -286,9 +288,9 @@ template > *> void BinarySeriali variant); } -template > *> void BinarySerializer::write(const Type &customType) +template > *> void BinarySerializer::write(const Type &customType, BinaryVersion version) { - writeCustomType(*this, customType); + writeCustomType(*this, customType, version); } } // namespace BinaryReflector diff --git a/lib/binary/serializable.h b/lib/binary/serializable.h index 9e65633..c923b54 100644 --- a/lib/binary/serializable.h +++ b/lib/binary/serializable.h @@ -17,25 +17,26 @@ namespace ReflectiveRapidJSON { /*! * \brief The BinarySerializable class provides the CRTP-base for (de)serializable objects. */ -template struct BinarySerializable { +template struct BinarySerializable { void toBinary(std::ostream &outputStream) const; void restoreFromBinary(std::istream &inputStream); static Type fromBinary(std::istream &inputStream); static constexpr const char *qualifiedName = "ReflectiveRapidJSON::BinarySerializable"; + static constexpr auto defaultSerializeVersion = defaultVersion; }; -template inline void BinarySerializable::toBinary(std::ostream &outputStream) const +template inline void BinarySerializable::toBinary(std::ostream &outputStream) const { - BinaryReflector::BinarySerializer(&outputStream).write(static_cast(*this)); + BinaryReflector::BinarySerializer(&outputStream).write(static_cast(*this), defaultVersion); } -template inline void BinarySerializable::restoreFromBinary(std::istream &inputStream) +template inline void BinarySerializable::restoreFromBinary(std::istream &inputStream) { BinaryReflector::BinaryDeserializer(&inputStream).read(static_cast(*this)); } -template Type BinarySerializable::fromBinary(std::istream &inputStream) +template Type BinarySerializable::fromBinary(std::istream &inputStream) { Type object; static_cast &>(object).restoreFromBinary(inputStream);