From 889eb7d8469bf529bea2453639e414627fa41e39 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Sat, 17 Dec 2022 13:06:16 +0100 Subject: [PATCH] Revert "Implement JSON difference serialization" This reverts commit 6bfb0205fd849dcdf6c4ecf9d650c96c2c0268a1. --- Source/Engine/Serialization/JsonConverters.cs | 8 -- Source/Engine/Serialization/JsonSerializer.cs | 121 +----------------- Source/Engine/UI/UIControl.cs | 33 +---- 3 files changed, 8 insertions(+), 154 deletions(-) diff --git a/Source/Engine/Serialization/JsonConverters.cs b/Source/Engine/Serialization/JsonConverters.cs index c194b766e..4de09cb5d 100644 --- a/Source/Engine/Serialization/JsonConverters.cs +++ b/Source/Engine/Serialization/JsonConverters.cs @@ -37,11 +37,7 @@ namespace FlaxEngine.Json { // Skip serialization as reference id for the root object serialization (eg. Script) var cache = JsonSerializer.Current.Value; -#if !USE_NETCORE if (cache != null && cache.IsDuringSerialization && cache.SerializerWriter.SerializeStackSize == 0) -#else - if (cache != null && cache.IsDuringSerialization) -#endif { return false; } @@ -146,7 +142,6 @@ namespace FlaxEngine.Json writer.WriteEndObject(); } -#if !USE_NETCORE /// public override void WriteJsonDiff(JsonWriter writer, object value, object other, Newtonsoft.Json.JsonSerializer serializer) { @@ -175,7 +170,6 @@ namespace FlaxEngine.Json } writer.WriteEndObject(); } -#endif /// public override object ReadJson(JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) @@ -238,10 +232,8 @@ namespace FlaxEngine.Json /// public override bool CanWrite => true; -#if !USE_NETCORE /// public override bool CanWriteDiff => true; -#endif } /// diff --git a/Source/Engine/Serialization/JsonSerializer.cs b/Source/Engine/Serialization/JsonSerializer.cs index b22f92927..29a5951f9 100644 --- a/Source/Engine/Serialization/JsonSerializer.cs +++ b/Source/Engine/Serialization/JsonSerializer.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. using System; -using System.Collections.Generic; using System.Globalization; using System.IO; using System.Runtime.CompilerServices; @@ -12,7 +11,7 @@ using FlaxEngine.Json.JsonCustomSerializers; using FlaxEngine.Utilities; using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; namespace FlaxEngine.Json { @@ -24,11 +23,7 @@ namespace FlaxEngine.Json public StringBuilder StringBuilder; public StringWriter StringWriter; public JsonTextWriter JsonWriter; -#if !USE_NETCORE public JsonSerializerInternalWriter SerializerWriter; -#else - public /*JsonSerializerInternalWriter*/ object SerializerWriter; -#endif public UnmanagedMemoryStream MemoryStream; public StreamReader Reader; public bool IsDuringSerialization; @@ -37,18 +32,9 @@ namespace FlaxEngine.Json { JsonSerializer = Newtonsoft.Json.JsonSerializer.CreateDefault(settings); JsonSerializer.Formatting = Formatting.Indented; -#if USE_NETCORE - Type jsonSerializerInternalWriterType = - typeof(Newtonsoft.Json.Serialization.IValueProvider).Assembly.GetType( - "Newtonsoft.Json.Serialization.JsonSerializerInternalWriter"); - System.Reflection.ConstructorInfo ctor = jsonSerializerInternalWriterType.GetConstructors - (System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public)[0]; - SerializerWriter = ctor.Invoke(new object[] { JsonSerializer }); -#else - SerializerWriter = new JsonSerializerInternalWriter(JsonSerializer); -#endif StringBuilder = new StringBuilder(256); StringWriter = new StringWriter(StringBuilder, CultureInfo.InvariantCulture); + SerializerWriter = new JsonSerializerInternalWriter(JsonSerializer); MemoryStream = new UnmanagedMemoryStream((byte*)0, 0); Reader = new StreamReader(MemoryStream, Encoding.UTF8, false); JsonWriter = new JsonTextWriter(StringWriter) @@ -121,72 +107,7 @@ namespace FlaxEngine.Json return sceneObjA.PrefabObjectID == sceneObjB.PrefabObjectID; }*/ - // Based on Newtonsoft.Json MiscellaneousUtils-class ValueEquals-method - bool DefaultValueEquals(object objA_, object objB_) - { - bool IsInteger(object value) - { - var type = value.GetType(); - return type == typeof(SByte) || - type == typeof(Byte) || - type == typeof(Int16) || - type == typeof(UInt16) || - type == typeof(Int32) || - type == typeof(UInt32) || - type == typeof(Int64) || - type == typeof(SByte) || - type == typeof(UInt64); - } - - if (objA_ == objB_) - { - return true; - } - if (objA_ == null || objB_ == null) - { - return false; - } - - // comparing an Int32 and Int64 both of the same value returns false - // make types the same then compare - if (objA_.GetType() != objB_.GetType()) - { - if (IsInteger(objA_) && IsInteger(objB_)) - { - return Convert.ToDecimal(objA_, CultureInfo.CurrentCulture).Equals(Convert.ToDecimal(objB_, CultureInfo.CurrentCulture)); - } - else if ((objA_ is double || objA_ is float || objA_ is decimal) && (objB_ is double || objB_ is float || objB_ is decimal)) - { - return Mathd.NearEqual(Convert.ToDouble(objA_, CultureInfo.CurrentCulture), Convert.ToDouble(objB_, CultureInfo.CurrentCulture)); - } - else - { - return false; - } - } - - // Diff on collections - if (objA_ is System.Collections.IList aList && objB_ is System.Collections.IList bList) - { - if (aList.Count != bList.Count) - return false; - } - if (objA_ is System.Collections.IEnumerable aEnumerable && objB_ is System.Collections.IEnumerable bEnumerable) - { - var aEnumerator = aEnumerable.GetEnumerator(); - var bEnumerator = bEnumerable.GetEnumerator(); - while (aEnumerator.MoveNext()) - { - if (!bEnumerator.MoveNext() || !ValueEquals(aEnumerator.Current, bEnumerator.Current)) - return false; - } - return !bEnumerator.MoveNext(); - } - - return objA_.Equals(objB_); - } - - return /*Newtonsoft.Json.Utilities.MiscellaneousUtils.*/DefaultValueEquals(objA, objB); + return Newtonsoft.Json.Utilities.MiscellaneousUtils.DefaultValueEquals(objA, objB); } /// @@ -203,17 +124,7 @@ namespace FlaxEngine.Json cache.StringBuilder.Clear(); cache.IsDuringSerialization = true; -#if !USE_NETCORE cache.SerializerWriter.Serialize(cache.JsonWriter, obj, type); -#else - Type jsonSerializerInternalWriterType = - typeof(Newtonsoft.Json.Serialization.IValueProvider).Assembly.GetType( - "Newtonsoft.Json.Serialization.JsonSerializerInternalWriter"); - - System.Reflection.MethodInfo Serialize = jsonSerializerInternalWriterType.GetMethod("Serialize", - System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public); - Serialize.Invoke(cache.SerializerWriter, new object[] { cache.JsonWriter, obj, type }); -#endif return cache.StringBuilder.ToString(); } @@ -232,17 +143,7 @@ namespace FlaxEngine.Json cache.StringBuilder.Clear(); cache.IsDuringSerialization = true; -#if !USE_NETCORE cache.SerializerWriter.Serialize(cache.JsonWriter, obj, type); -#else - Type jsonSerializerInternalWriterType = - typeof(Newtonsoft.Json.Serialization.IValueProvider).Assembly.GetType( - "Newtonsoft.Json.Serialization.JsonSerializerInternalWriter"); - - System.Reflection.MethodInfo Serialize = jsonSerializerInternalWriterType.GetMethod("Serialize", - System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public); - Serialize.Invoke(cache.SerializerWriter, new object[] { cache.JsonWriter, obj, type }); -#endif return cache.StringBuilder.ToString(); } @@ -256,25 +157,15 @@ namespace FlaxEngine.Json /// The output json string. public static string SerializeDiff(object obj, object other, bool isManagedOnly = false) { + Type type = obj.GetType(); var cache = isManagedOnly ? CacheManagedOnly.Value : Cache.Value; Current.Value = cache; cache.StringBuilder.Clear(); cache.IsDuringSerialization = true; + cache.SerializerWriter.SerializeDiff(cache.JsonWriter, obj, type, other); - JObject jObj = JObject.FromObject(obj, cache.JsonSerializer); - JObject jOther = JObject.FromObject(other, cache.JsonSerializer); - JObject diff = new JObject(); - foreach (KeyValuePair prop in jObj) - { - JProperty otherProp = jOther.Property(prop.Key); - if (JToken.DeepEquals(prop.Value, otherProp.Value)) - continue; - - diff.Add(prop.Key, prop.Value); - } - - return diff.ToString(); + return cache.StringBuilder.ToString(); } /// diff --git a/Source/Engine/UI/UIControl.cs b/Source/Engine/UI/UIControl.cs index 9b32774ff..bd1d2e795 100644 --- a/Source/Engine/UI/UIControl.cs +++ b/Source/Engine/UI/UIControl.cs @@ -6,9 +6,7 @@ using System.IO; using System.Text; using FlaxEngine.GUI; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; -using System.Collections.Generic; namespace FlaxEngine { @@ -342,22 +340,10 @@ namespace FlaxEngine jsonWriter.StringEscapeHandling = jsonSerializer.StringEscapeHandling; jsonWriter.Culture = jsonSerializer.Culture; jsonWriter.DateFormatString = jsonSerializer.DateFormatString; -#if !USE_NETCORE + JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(jsonSerializer); serializerWriter.Serialize(jsonWriter, _control, type); -#else - Type jsonSerializerInternalWriterType = - typeof(Newtonsoft.Json.Serialization.IValueProvider).Assembly.GetType( - "Newtonsoft.Json.Serialization.JsonSerializerInternalWriter"); - System.Reflection.ConstructorInfo ctor = jsonSerializerInternalWriterType.GetConstructors - (System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public)[0]; - object serializerWriter = ctor.Invoke(new object[] { jsonSerializer }); - - System.Reflection.MethodInfo Serialize = jsonSerializerInternalWriterType.GetMethod("Serialize", - System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public); - Serialize.Invoke(serializerWriter, new object[] { jsonWriter, _control, type }); -#endif } controlType = type.FullName; @@ -394,25 +380,10 @@ namespace FlaxEngine jsonWriter.StringEscapeHandling = jsonSerializer.StringEscapeHandling; jsonWriter.Culture = jsonSerializer.Culture; jsonWriter.DateFormatString = jsonSerializer.DateFormatString; -#if !USE_NETCORE + JsonSerializerInternalWriter serializerWriter = new JsonSerializerInternalWriter(jsonSerializer); serializerWriter.SerializeDiff(jsonWriter, _control, type, other._control); -#else - JObject jObj = JObject.FromObject(_control, jsonSerializer); - JObject jOther = JObject.FromObject(other._control, jsonSerializer); - JObject diff = new JObject(); - foreach (KeyValuePair prop in jObj) - { - JProperty otherProp = jOther.Property(prop.Key); - if (JToken.DeepEquals(prop.Value, otherProp.Value)) - continue; - - diff.Add(prop.Key, prop.Value); - } - - diff.WriteTo(jsonWriter); -#endif } controlType = string.Empty;