From 9e222daeb2b894099d525d8fac220a57cfef54bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Thu, 28 Dec 2023 23:05:49 +0100 Subject: [PATCH] ScriptCore: Fixed deserialization of null values --- .../Serialization/DeserializationObject.cs | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/ScriptCore/Serialization/DeserializationObject.cs b/ScriptCore/Serialization/DeserializationObject.cs index d121304..c4aaf31 100644 --- a/ScriptCore/Serialization/DeserializationObject.cs +++ b/ScriptCore/Serialization/DeserializationObject.cs @@ -12,6 +12,16 @@ namespace GlitchyEngine.Serialization; internal class DeserializationObject { + private class NoObject + { + + } + + /// + /// Object used to specify, that no particular value was deserialized for the field and thus the value currently stored shall not be changed. + /// + private static readonly NoObject NoValueDeserialized = new (); + private IntPtr _internalContext; private UUID _id; @@ -202,7 +212,7 @@ internal class DeserializationObject case SerializationType.ObjectReference: return *(UUID*)rawData; default: - return null; + return NoValueDeserialized; } } @@ -234,7 +244,7 @@ internal class DeserializationObject { Type fieldType = field.FieldType; - object newFieldValue = null; + object newFieldValue = NoValueDeserialized; if (fieldType.IsPrimitive) { @@ -284,7 +294,7 @@ internal class DeserializationObject Log.Error($"Encountered unhandled type \"{fieldType}\" while serializing."); } - if (newFieldValue != null) + if (newFieldValue != NoValueDeserialized) { field.SetValue(targetInstance, newFieldValue); return true; @@ -336,7 +346,7 @@ internal class DeserializationObject private object DeserializeEnum(string fieldName, Type enumType) { if (GetFieldValue(fieldName, SerializationType.Enum) is not string valueName) - return null; + return NoValueDeserialized; try { @@ -347,7 +357,7 @@ internal class DeserializationObject Log.Error($"Failed to parse \"{valueName}\" as enum-type \"{enumType}\""); } - return null; + return NoValueDeserialized; } private object DeserializeStruct(string fieldName, object targetInstance) @@ -358,7 +368,7 @@ internal class DeserializationObject PopScope(); - return changed ? targetInstance : null; + return changed ? targetInstance : NoValueDeserialized; } private unsafe object DeserializeClass(string fieldName, Type fieldType) @@ -380,7 +390,7 @@ internal class DeserializationObject Type type = GetTypeFromName(fullTypeName); if (type == null) - return null; + return NoValueDeserialized; if (isEntity) {