From a8c7705c3bbd8e8afbb8280db7395dd2907a59ba Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 19 Aug 2021 13:03:54 +0200 Subject: [PATCH] Fix null values handling in C# Json serialization It didn't replace prefab object reference if replaced with null in the prefab instance. --- Source/Engine/Serialization/JsonSerializer.cs | 7 ++++++- Source/Engine/UI/GUI/Control.cs | 4 ++-- Source/Tools/FlaxEngine.Tests/TestSerialization.cs | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Serialization/JsonSerializer.cs b/Source/Engine/Serialization/JsonSerializer.cs index 24c6abb6d..0efb7433d 100644 --- a/Source/Engine/Serialization/JsonSerializer.cs +++ b/Source/Engine/Serialization/JsonSerializer.cs @@ -73,7 +73,7 @@ namespace FlaxEngine.Json ContractResolver = new ExtendedDefaultContractResolver(isManagedOnly), ReferenceLoopHandling = ReferenceLoopHandling.Ignore, TypeNameHandling = TypeNameHandling.Auto, - NullValueHandling = NullValueHandling.Ignore, + NullValueHandling = NullValueHandling.Include, ObjectCreationHandling = ObjectCreationHandling.Auto, }; if (ObjectConverter == null) @@ -276,6 +276,11 @@ namespace FlaxEngine.Json cache.IsDuringSerialization = false; Current.Value = cache; + /*// Debug json string reading + cache.MemoryStream.Initialize(jsonBuffer, jsonLength); + cache.Reader.DiscardBufferedData(); + string json = cache.Reader.ReadToEnd();*/ + cache.MemoryStream.Initialize(jsonBuffer, jsonLength); cache.Reader.DiscardBufferedData(); var jsonReader = new JsonTextReader(cache.Reader); diff --git a/Source/Engine/UI/GUI/Control.cs b/Source/Engine/UI/GUI/Control.cs index afdd86bcb..ca62f117f 100644 --- a/Source/Engine/UI/GUI/Control.cs +++ b/Source/Engine/UI/GUI/Control.cs @@ -877,7 +877,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the tooltip text. /// - [HideInEditor] + [HideInEditor, NoSerialize] public string TooltipText { get => _tooltipText; @@ -887,7 +887,7 @@ namespace FlaxEngine.GUI /// /// Gets or sets the custom tooltip control linked. Use null to show default shared tooltip from the current . /// - [HideInEditor] + [HideInEditor, NoSerialize] public Tooltip CustomTooltip { get => _tooltip; diff --git a/Source/Tools/FlaxEngine.Tests/TestSerialization.cs b/Source/Tools/FlaxEngine.Tests/TestSerialization.cs index 00731c7ad..e539af803 100644 --- a/Source/Tools/FlaxEngine.Tests/TestSerialization.cs +++ b/Source/Tools/FlaxEngine.Tests/TestSerialization.cs @@ -47,15 +47,15 @@ namespace FlaxEngine.Tests { ObjectOne obj = new ObjectOne(); - Assert.AreEqual("{\n\t\"MyValue\": 0.0,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 0.0\n\t}\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); + Assert.AreEqual("{\n\t\"MyValue\": 0.0,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 0.0\n\t},\n\t\"MyArray\": null\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); obj.MyValue = 1.2f; - Assert.AreEqual("{\n\t\"MyValue\": 1.2,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 0.0\n\t}\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); + Assert.AreEqual("{\n\t\"MyValue\": 1.2,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 0.0\n\t},\n\t\"MyArray\": null\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); obj.MyVector.Y = 2.0f; - Assert.AreEqual("{\n\t\"MyValue\": 1.2,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 2.0\n\t}\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); + Assert.AreEqual("{\n\t\"MyValue\": 1.2,\n\t\"MyVector\": {\n\t\t\"X\": 0.0,\n\t\t\"Y\": 2.0\n\t},\n\t\"MyArray\": null\n}", FilterLineBreak(JsonSerializer.Serialize(obj))); obj.MyArray = new[] {