From b5e324673ea5e2e4c7d422a3ce7216e2059c5da1 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 23 Mar 2021 12:29:25 +0100 Subject: [PATCH] Fixes for serialization problems with custom structures --- Source/Engine/Serialization/Serialization.h | 26 +++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Serialization/Serialization.h b/Source/Engine/Serialization/Serialization.h index 4aec76397..29642f850 100644 --- a/Source/Engine/Serialization/Serialization.h +++ b/Source/Engine/Serialization/Serialization.h @@ -345,6 +345,24 @@ namespace Serialization v.Deserialize(stream, modifier); } + template + inline typename TEnableIf::Value, bool>::Type ShouldSerialize(ISerializable& v, const void* otherObj) + { + return true; + } + template + inline typename TEnableIf::Value>::Type Serialize(ISerializable::SerializeStream& stream, ISerializable& v, const void* otherObj) + { + stream.StartObject(); + v.Serialize(stream, otherObj); + stream.EndObject(); + } + template + inline typename TEnableIf::Value>::Type Deserialize(ISerializable::DeserializeStream& stream, ISerializable& v, ISerializeModifier* modifier) + { + v.Deserialize(stream, modifier); + } + // Scripting Object template @@ -460,7 +478,7 @@ namespace Serialization return true; for (int32 i = 0; i < v.Count(); i++) { - if (ShouldSerialize(v[i], &other->At(i))) + if (ShouldSerialize((T&)v[i], (const void*)&other->At(i))) return true; } return false; @@ -470,7 +488,7 @@ namespace Serialization { stream.StartArray(); for (int32 i = 0; i < v.Count(); i++) - Serialize(stream, v[i], nullptr); + Serialize(stream, (T&)v[i], nullptr); stream.EndArray(); } template @@ -481,7 +499,7 @@ namespace Serialization const auto& streamArray = stream.GetArray(); v.Resize(streamArray.Size()); for (int32 i = 0; i < v.Count(); i++) - Deserialize(streamArray[i], v[i], modifier); + Deserialize(streamArray[i], (T&)v[i], modifier); } // Dictionary @@ -496,7 +514,7 @@ namespace Serialization return true; for (auto& i : v) { - if (!other->ContainsKey(i.Key) || ShouldSerialize(i.Value, &other->At(i.Key))) + if (!other->ContainsKey(i.Key) || ShouldSerialize(i.Value, (const void*)&other->At(i.Key))) return true; } return false;