diff --git a/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf b/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf index 6d90e62..613a90c 100644 --- a/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf +++ b/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf @@ -105,17 +105,22 @@ class SerializedObject if (primitiveType == .String) { - MonoString* string = (.)value; - - char8* rawStringValue = Mono.mono_string_to_utf8(string); + // If the string is null, we store a nullptr and 0-length + StringView valueView = StringView(null, 0); - String stringValue = new String(rawStringValue); + if (value != null) + { + MonoString* string = (.)value; + char8* rawStringValue = Mono.mono_string_to_utf8(string); - _ownedString.Add(stringValue); + String stringValue = new String(rawStringValue); - Mono.mono_free(rawStringValue); - - StringView valueView = stringValue; + _ownedString.Add(stringValue); + + Mono.mono_free(rawStringValue); + + valueView = stringValue; + } Internal.MemCpy(&data, &valueView, sizeof(StringView)); } diff --git a/ScriptCore/Serialization/EntitySerializer.cs b/ScriptCore/Serialization/EntitySerializer.cs index 527dd06..7b84aea 100644 --- a/ScriptCore/Serialization/EntitySerializer.cs +++ b/ScriptCore/Serialization/EntitySerializer.cs @@ -128,7 +128,7 @@ public static class EntitySerializer } else if (fieldType == typeof(string)) { - AddField(fieldName, SerializationType.String, fieldValue.ToString()); + AddField(fieldName, SerializationType.String, fieldValue); } else if (fieldType.IsEnum) { @@ -317,8 +317,15 @@ public static class EntitySerializer { // rawData contains a Pointer and a string length! byte* utf8Ptr = *(byte**)rawData; + + if (utf8Ptr == null) + return null; + ulong length = *(ulong*)(rawData + 8); + if (length == 0) + return string.Empty; + return Encoding.UTF8.GetString(utf8Ptr, (int)length); }