diff --git a/flow/ObjectSerializer.h b/flow/ObjectSerializer.h index fbeee1e67d..2ef06e0299 100644 --- a/flow/ObjectSerializer.h +++ b/flow/ObjectSerializer.h @@ -68,6 +68,7 @@ struct SaveContext { template class _ObjectReader { +protected: ProtocolVersion mProtocolVersion; public: @@ -103,6 +104,10 @@ class ObjectReader : public _ObjectReader { public: static constexpr bool ownsUnderlyingMemory = false; + ObjectReader(const uint8_t *data, ProtocolVersion protocolVersion) : _data(data) { + mProtocolVersion = protocolVersion; + } + template ObjectReader(const uint8_t* data, VersionOptions vo) : _data(data) { vo.read(*this); diff --git a/flow/serialize.h b/flow/serialize.h index 300410186d..a78bf8ab38 100644 --- a/flow/serialize.h +++ b/flow/serialize.h @@ -603,6 +603,8 @@ public: }; class BinaryReader : public _Reader { + std::unique_ptr objectReader; + public: const void* readBytes( int bytes ); @@ -632,18 +634,47 @@ public: end = begin + length; check = nullptr; vo.read(*this); + if (m_protocolVersion.hasObjectSerializerFlag()) { + objectReader = std::make_unique(reinterpret_cast(begin), m_protocolVersion); + } } template BinaryReader( const StringRef& s, VersionOptions vo ) { begin = (const char*)s.begin(); end = begin + s.size(); + check = nullptr; vo.read(*this); + if (m_protocolVersion.hasObjectSerializerFlag()) { + objectReader = std::make_unique(reinterpret_cast(begin), m_protocolVersion); + } } template BinaryReader( const std::string& v, VersionOptions vo ) { begin = v.c_str(); end = begin + v.size(); + check = nullptr; vo.read(*this); + if (m_protocolVersion.hasObjectSerializerFlag()) { + objectReader = std::make_unique(reinterpret_cast(begin), m_protocolVersion); + } + } + + template + void deserialize(T &t) { + if (objectReader) { + objectReader->deserialize(t); + } else { + t.serialize(*this); + } + } +}; + +template +class Serializer::value>> { +public: + static void serialize( BinaryReader& ar, T& t ) { + ar.deserialize(t); + ASSERT( ar.protocolVersion().isValid() ); } };