From 7a548e9f3af76f77b28e0064a123e97d7bee55de Mon Sep 17 00:00:00 2001 From: Ard van der Marel <109339598+Ard2025@users.noreply.github.com> Date: Sun, 5 Oct 2025 21:09:46 +0200 Subject: [PATCH 1/4] Reduce memory useage on serializing --- Magic.IndexedDb/Models/MagicContractResolver.cs | 3 ++- TestWasm/Pages/Home.razor | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Magic.IndexedDb/Models/MagicContractResolver.cs b/Magic.IndexedDb/Models/MagicContractResolver.cs index 38de04b..4e71656 100644 --- a/Magic.IndexedDb/Models/MagicContractResolver.cs +++ b/Magic.IndexedDb/Models/MagicContractResolver.cs @@ -374,7 +374,8 @@ private void WriteSimpleType(Utf8JsonWriter writer, object value) switch (value) { case string str: - writer.WriteStringValue(str); + str = str.Replace("\"", "\\\""); + writer.WriteRawValue("\"" + str + "\"", true); break; case bool b: writer.WriteBooleanValue(b); diff --git a/TestWasm/Pages/Home.razor b/TestWasm/Pages/Home.razor index 396097c..339b8b8 100644 --- a/TestWasm/Pages/Home.razor +++ b/TestWasm/Pages/Home.razor @@ -234,7 +234,7 @@ IndexOrderingProperties = new List> { Person[] persons = new Person[] { - new Person { Name = "Zack", DateOfBirth = null, TestInt = 9, _Age = 45, GUIY = Guid.NewGuid(), DoNotMapTest = "I buried treasure behind my house", Access=Person.Permissions.CanRead}, + new Person { Name = "Zack", DateOfBirth = null, TestInt = 9, _Age = 45, GUIY = Guid.NewGuid(), DoNotMapTest = "I buried treasure behind my house", Access=Person.Permissions.CanRead, Secret = new String('a', 45000000)}, new Person { Name = "Luna", TestInt = 9, DateOfBirth = GetDateWithSameMonthDay(GetRandomYear()), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "Jerry is my husband and I had an affair with Bob.", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite}, new Person { Name = "Jerry", TestInt = 9, DateOfBirth = GetDateWithSameMonthDay(GetRandomYear()), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "My wife is amazing", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite|Person.Permissions.CanCreate}, new Person { Name = "Jamie", TestInt = 9, DateOfBirth = GetDateWithSameMonthDay(GetRandomYear()), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "My wife is amazing", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite|Person.Permissions.CanCreate}, From 399c1d3a0586811a547fcfdfe11148fb36312288 Mon Sep 17 00:00:00 2001 From: Ard van der Marel <109339598+Ard2025@users.noreply.github.com> Date: Sun, 5 Oct 2025 21:11:59 +0200 Subject: [PATCH 2/4] update server test to test memory 45MB --- TestBase/Data/PersonData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TestBase/Data/PersonData.cs b/TestBase/Data/PersonData.cs index 256a244..a963b50 100644 --- a/TestBase/Data/PersonData.cs +++ b/TestBase/Data/PersonData.cs @@ -6,7 +6,7 @@ public static class PersonData { public static Person[] persons = [ - new Person { _Id = 1, Name = "Zack", DateOfBirth = null, TestInt = 9, _Age = 45, GUIY = Guid.NewGuid(), DoNotMapTest = "I buried treasure behind my house", Access=Person.Permissions.CanRead}, + new Person { _Id = 1, Name = "Zack", DateOfBirth = null, TestInt = 9, _Age = 45, GUIY = Guid.NewGuid(), DoNotMapTest = "I buried treasure behind my house", Access=Person.Permissions.CanRead, Secret = new String('a', 45000000)}, new Person { _Id = 2, Name = "Luna", TestInt = 9, DateOfBirth = new DateTime(1980, 1, 1), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "Jerry is my husband and I had an affair with Bob.", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite}, new Person { _Id = 3, Name = "Jerry", TestInt = 9, DateOfBirth = new DateTime(1981, 1, 1), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "My wife is amazing", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite|Person.Permissions.CanCreate}, new Person { _Id = 4, Name = "Jamie", TestInt = 9, DateOfBirth = new DateTime(1982, 1, 1), _Age = 35, GUIY = Guid.NewGuid(), DoNotMapTest = "My wife is amazing", Access = Person.Permissions.CanRead|Person.Permissions.CanWrite|Person.Permissions.CanCreate}, From a6c0ddb9073698de754fab243a18de8ef92d74ba Mon Sep 17 00:00:00 2001 From: Ard van der Marel <109339598+Ard2025@users.noreply.github.com> Date: Sun, 5 Oct 2025 21:41:55 +0200 Subject: [PATCH 3/4] Andisposing the responseStream correctly --- Magic.IndexedDb/Extensions/MagicJsInvoke.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Magic.IndexedDb/Extensions/MagicJsInvoke.cs b/Magic.IndexedDb/Extensions/MagicJsInvoke.cs index cf6eaf3..abe9e4f 100644 --- a/Magic.IndexedDb/Extensions/MagicJsInvoke.cs +++ b/Magic.IndexedDb/Extensions/MagicJsInvoke.cs @@ -122,7 +122,7 @@ internal async Task CallInvokeVoidDefaultJsAsync(string modulePath, string funct stream.Position = 0; - var streamRef = new DotNetStreamReference(stream); + using var streamRef = new DotNetStreamReference(stream); // Send to JS var responseStreamRef = await _jsModule.InvokeAsync("streamedJsHandler", @@ -133,6 +133,7 @@ internal async Task CallInvokeVoidDefaultJsAsync(string modulePath, string funct using var reader = new StreamReader(responseStream); string jsonResponse = await reader.ReadToEndAsync(); + await responseStreamRef.DisposeAsync(); return MagicSerializationHelper.DeserializeObject(jsonResponse, settings); } From 2d9550ad34f6683b0e366b382968434f16638eec Mon Sep 17 00:00:00 2001 From: Ard van der Marel <109339598+Ard2025@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:32:10 +0100 Subject: [PATCH 4/4] Improve internal serializeing of List> and enum --- Magic.IndexedDb/Interfaces/ITypedArgument.cs | 1 - Magic.IndexedDb/Models/MagicContractResolver.cs | 9 +++++++++ Magic.IndexedDb/Models/TypedArgument.cs | 5 ----- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Magic.IndexedDb/Interfaces/ITypedArgument.cs b/Magic.IndexedDb/Interfaces/ITypedArgument.cs index 098f65d..ec5c9c5 100644 --- a/Magic.IndexedDb/Interfaces/ITypedArgument.cs +++ b/Magic.IndexedDb/Interfaces/ITypedArgument.cs @@ -5,7 +5,6 @@ namespace Magic.IndexedDb.Interfaces; public interface ITypedArgument { - string Serialize(); // Still needed for some cases JsonElement SerializeToJsonElement(MagicJsonSerializationSettings? settings = null); // Ensures proper object passing string SerializeToJsonString(MagicJsonSerializationSettings? settings = null); } \ No newline at end of file diff --git a/Magic.IndexedDb/Models/MagicContractResolver.cs b/Magic.IndexedDb/Models/MagicContractResolver.cs index 4e71656..e3aca0b 100644 --- a/Magic.IndexedDb/Models/MagicContractResolver.cs +++ b/Magic.IndexedDb/Models/MagicContractResolver.cs @@ -342,6 +342,12 @@ private bool SerializeIEnumerable(Utf8JsonWriter writer, object? value, JsonSeri continue; } + if (item is IEnumerable nestedEnumerable && item.GetType() != typeof(string)) + { + SerializeIEnumerable(writer, nestedEnumerable, options); + continue; + } + if (item != null) { Type itemType = item.GetType(); @@ -398,6 +404,9 @@ private void WriteSimpleType(Utf8JsonWriter writer, object value) case Guid guid: writer.WriteStringValue(guid.ToString()); break; + case Enum e: + writer.WriteNumberValue(((IConvertible)e).ToInt32(null)); + break; default: JsonSerializer.Serialize(writer, value); break; diff --git a/Magic.IndexedDb/Models/TypedArgument.cs b/Magic.IndexedDb/Models/TypedArgument.cs index 6074336..adfd757 100644 --- a/Magic.IndexedDb/Models/TypedArgument.cs +++ b/Magic.IndexedDb/Models/TypedArgument.cs @@ -13,11 +13,6 @@ public TypedArgument(T? value) Value = value; } - public string Serialize() - { - return MagicSerializationHelper.SerializeObject(Value); - } - public JsonElement SerializeToJsonElement(MagicJsonSerializationSettings? settings = null) { return MagicSerializationHelper.SerializeObjectToJsonElement(Value, settings);