From 6f36cfff0c6e5e41db3e339f1e652f292ae78653 Mon Sep 17 00:00:00 2001 From: raymonddenhaan <155616759+raymonddenhaan@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:47:46 +0200 Subject: [PATCH] Update serialization and conversion functions (#5682) * Update serialization and conversion functions Updated JSON conversion to be able to use type aliases when saving serialized data to the DB. * Simplify and update type alias registration. Removed redundant XML comments and replaced IDictionary type aliases with Dictionary equivalents for consistency. These changes improve code readability and maintainability. * Use collection initializer syntax * Change "_type" values to "ObjectDictionary" in test files Updated the "_type" field in various JSON test files from multiple different values to a unified "ObjectDictionary". This ensures consistency across the test files and aligns with the expected type format. --------- Co-authored-by: Sipke Schoorstra --- .../Records/ActivityExecutionRecord.cs | 5 +++ .../DapperActivityExecutionRecordStore.cs | 12 ++++--- .../Runtime/ActivityExecutionLogStore.cs | 12 +++---- .../Runtime/WorkflowExecutionLogStore.cs | 2 +- .../Options/ExpressionOptions.cs | 27 +++++---------- .../Features/FlowchartFeature.cs | 7 ++++ .../PolymorphicDictionaryConverter.cs | 5 +-- .../Converters/PolymorphicObjectConverter.cs | 33 +++++++++++-------- .../PolymorphicObjectConverterFactory.cs | 7 ++-- .../JsonWorkflowStateSerializer.cs | 2 +- .../JsonSerialization/JArrayIsland.json | 2 +- .../JsonSerialization/JArrayWithoutType.json | 2 +- .../JsonSerialization/JObjectIsland.json | 2 +- .../JsonSerialization/JObjectWithoutType.json | 2 +- .../JsonSerialization/JsonArrayIsland.json | 2 +- .../JsonSerialization/JsonObjectIsland.json | 2 +- .../JsonObjectWithoutType.json | 2 +- .../Serialization/Polymorphism/Tests.cs | 4 +-- 18 files changed, 71 insertions(+), 59 deletions(-) diff --git a/src/modules/Elsa.Dapper/Modules/Runtime/Records/ActivityExecutionRecord.cs b/src/modules/Elsa.Dapper/Modules/Runtime/Records/ActivityExecutionRecord.cs index ee98a3aa2..c7f01f24d 100644 --- a/src/modules/Elsa.Dapper/Modules/Runtime/Records/ActivityExecutionRecord.cs +++ b/src/modules/Elsa.Dapper/Modules/Runtime/Records/ActivityExecutionRecord.cs @@ -60,6 +60,11 @@ public class ActivityExecutionRecordRecord /// public string? SerializedException { get; set; } + /// + /// Any properties provided by the activity. + /// + public string? SerializedProperties { get; set; } + /// /// Gets or sets the time at which the activity execution began. /// diff --git a/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperActivityExecutionRecordStore.cs b/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperActivityExecutionRecordStore.cs index d1cf4c86a..6ba1e6757 100644 --- a/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperActivityExecutionRecordStore.cs +++ b/src/modules/Elsa.Dapper/Modules/Runtime/Stores/DapperActivityExecutionRecordStore.cs @@ -130,10 +130,11 @@ public class DapperActivityExecutionRecordStore : IActivityExecutionStore HasBookmarks = source.HasBookmarks, Status = source.Status.ToString(), ActivityTypeVersion = source.ActivityTypeVersion, - SerializedActivityState = source.ActivityState != null ? await _safeSerializer.SerializeAsync(source.ActivityState, cancellationToken) : default, - SerializedPayload = source.Payload != null ? await _safeSerializer.SerializeAsync(source.Payload, cancellationToken) : default, - SerializedOutputs = source.Outputs != null ? await _safeSerializer.SerializeAsync(source.Outputs, cancellationToken) : default, - SerializedException = source.Exception != null ? _payloadSerializer.Serialize(source.Exception) : default + SerializedActivityState = source.ActivityState != null ? await _safeSerializer.SerializeAsync(source.ActivityState, cancellationToken) : null, + SerializedPayload = source.Payload != null ? await _safeSerializer.SerializeAsync(source.Payload, cancellationToken) : null, + SerializedOutputs = source.Outputs?.Any() == true ? await _safeSerializer.SerializeAsync(source.Outputs, cancellationToken) : null, + SerializedException = source.Exception != null ? _payloadSerializer.Serialize(source.Exception) : null, + SerializedProperties = source.Properties.Any() ? await _safeSerializer.SerializeAsync(source.Properties, cancellationToken) : null }; } @@ -155,7 +156,8 @@ public class DapperActivityExecutionRecordStore : IActivityExecutionStore ActivityState = source.SerializedActivityState != null ? _payloadSerializer.Deserialize>(source.SerializedActivityState) : default, Payload = source.SerializedPayload != null ? await _safeSerializer.DeserializeAsync>(source.SerializedPayload, cancellationToken) : default, Outputs = source.SerializedOutputs != null ? await _safeSerializer.DeserializeAsync>(source.SerializedOutputs, cancellationToken) : default, - Exception = source.SerializedException != null ? _payloadSerializer.Deserialize(source.SerializedException) : default + Exception = source.SerializedException != null ? _payloadSerializer.Deserialize(source.SerializedException) : default, + Properties = source.SerializedProperties != null ? await _safeSerializer.DeserializeAsync>(source.SerializedProperties, cancellationToken) : default }; } diff --git a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/ActivityExecutionLogStore.cs b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/ActivityExecutionLogStore.cs index 23f4d53c1..da49cb3f1 100644 --- a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/ActivityExecutionLogStore.cs +++ b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/ActivityExecutionLogStore.cs @@ -83,15 +83,15 @@ public class EFCoreActivityExecutionStore( { entity = entity.SanitizeLogMessage(); var compressionAlgorithm = options.Value.CompressionAlgorithm ?? nameof(None); - var serializedActivityState = entity.ActivityState != null ? await safeSerializer.SerializeAsync(entity.ActivityState, cancellationToken) : default; - var compressedSerializedActivityState = serializedActivityState != null ? await compressionCodecResolver.Resolve(compressionAlgorithm).CompressAsync(serializedActivityState, cancellationToken) : default; + var serializedActivityState = entity.ActivityState != null ? await safeSerializer.SerializeAsync(entity.ActivityState, cancellationToken) : null; + var compressedSerializedActivityState = serializedActivityState != null ? await compressionCodecResolver.Resolve(compressionAlgorithm).CompressAsync(serializedActivityState, cancellationToken) : null; dbContext.Entry(entity).Property("SerializedActivityState").CurrentValue = compressedSerializedActivityState; dbContext.Entry(entity).Property("SerializedActivityStateCompressionAlgorithm").CurrentValue = compressionAlgorithm; - dbContext.Entry(entity).Property("SerializedOutputs").CurrentValue = entity.Outputs != null && entity.Outputs.Any() ? await safeSerializer.SerializeAsync(entity.Outputs, cancellationToken) : default; - dbContext.Entry(entity).Property("SerializedProperties").CurrentValue =entity.Properties.Any() ? payloadSerializer.Serialize(entity.Properties) : default; - dbContext.Entry(entity).Property("SerializedException").CurrentValue = entity.Exception != null ? payloadSerializer.Serialize(entity.Exception) : default; - dbContext.Entry(entity).Property("SerializedPayload").CurrentValue = entity.Payload != null ? payloadSerializer.Serialize(entity.Payload) : default; + dbContext.Entry(entity).Property("SerializedOutputs").CurrentValue = entity.Outputs?.Any() == true ? await safeSerializer.SerializeAsync(entity.Outputs, cancellationToken) : null; + dbContext.Entry(entity).Property("SerializedProperties").CurrentValue = entity.Properties.Any() ? payloadSerializer.Serialize(entity.Properties) : null; + dbContext.Entry(entity).Property("SerializedException").CurrentValue = entity.Exception != null ? payloadSerializer.Serialize(entity.Exception) : null; + dbContext.Entry(entity).Property("SerializedPayload").CurrentValue = entity.Payload?.Any() == true ? payloadSerializer.Serialize(entity.Payload) : null; } [RequiresUnreferencedCode("Calls Elsa.EntityFrameworkCore.Modules.Runtime.EFCoreActivityExecutionStore.DeserializeActivityState(RuntimeElsaDbContext, ActivityExecutionRecord, CancellationToken)")] diff --git a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/WorkflowExecutionLogStore.cs b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/WorkflowExecutionLogStore.cs index 6c4d4abd9..5ff56801b 100644 --- a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/WorkflowExecutionLogStore.cs +++ b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/WorkflowExecutionLogStore.cs @@ -87,7 +87,7 @@ public class EFCoreWorkflowExecutionLogStore : IWorkflowExecutionLogStore private async ValueTask OnSaveAsync(RuntimeElsaDbContext dbContext, WorkflowExecutionLogRecord entity, CancellationToken cancellationToken) { entity = entity.SanitizeLogMessage(); - dbContext.Entry(entity).Property("SerializedActivityState").CurrentValue = entity.ActivityState != null ? await _safeSerializer.SerializeAsync(entity.ActivityState, cancellationToken) : default; + dbContext.Entry(entity).Property("SerializedActivityState").CurrentValue = entity.ActivityState?.Any() == true ? await _safeSerializer.SerializeAsync(entity.ActivityState, cancellationToken) : default; dbContext.Entry(entity).Property("SerializedPayload").CurrentValue = entity.Payload != null ? await _safeSerializer.SerializeAsync(entity.Payload, cancellationToken) : default; } diff --git a/src/modules/Elsa.Expressions/Options/ExpressionOptions.cs b/src/modules/Elsa.Expressions/Options/ExpressionOptions.cs index 2a408afc1..460835be1 100644 --- a/src/modules/Elsa.Expressions/Options/ExpressionOptions.cs +++ b/src/modules/Elsa.Expressions/Options/ExpressionOptions.cs @@ -4,16 +4,12 @@ using Elsa.Extensions; namespace Elsa.Expressions.Options; -/// /// Options for the expression feature. -/// public class ExpressionOptions { private readonly IDictionary _aliasTypeDictionary = new Dictionary(); - - /// + /// Initializes a new instance of the class. - /// public ExpressionOptions() { AliasTypeDictionary = new ReadOnlyDictionary(_aliasTypeDictionary); @@ -34,23 +30,16 @@ public class ExpressionOptions this.AddTypeAlias("TimeSpan"); this.AddTypeAlias("ExpandoObject"); this.AddTypeAlias("JSON"); - this.AddTypeAlias>("StringDictionary"); - this.AddTypeAlias>("StringMap"); - this.AddTypeAlias>("ObjectMap"); - this.AddTypeAlias>("ObjectDictionary"); + this.AddTypeAlias>("StringDictionary"); + this.AddTypeAlias>("StringMap"); + this.AddTypeAlias>("ObjectMap"); + this.AddTypeAlias>("ObjectDictionary"); } - - /// + /// Gets the type alias dictionary. - /// public IDictionary AliasTypeDictionary { get; set; } - - /// - /// Registers a well known type alias. - /// - /// The type. - /// The alias. - /// The options. + + /// Registers a well-known type alias. public ExpressionOptions RegisterTypeAlias(Type type, string alias) { _aliasTypeDictionary[alias] = type; diff --git a/src/modules/Elsa.Workflows.Core/Features/FlowchartFeature.cs b/src/modules/Elsa.Workflows.Core/Features/FlowchartFeature.cs index 339f1472a..f489487bd 100644 --- a/src/modules/Elsa.Workflows.Core/Features/FlowchartFeature.cs +++ b/src/modules/Elsa.Workflows.Core/Features/FlowchartFeature.cs @@ -1,6 +1,7 @@ using Elsa.Extensions; using Elsa.Features.Abstractions; using Elsa.Features.Services; +using Elsa.Workflows.Activities.Flowchart.Models; using Elsa.Workflows.Activities.Flowchart.Serialization; namespace Elsa.Workflows.Features; @@ -19,5 +20,11 @@ public class FlowchartFeature : FeatureBase public override void Apply() { Services.AddSerializationOptionsConfigurator(); + + } + + public override void Configure() + { + Module.AddTypeAlias("FlowScope"); } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicDictionaryConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicDictionaryConverter.cs index 7e3ea6a5a..3e0060aa8 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicDictionaryConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicDictionaryConverter.cs @@ -1,5 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; +using Elsa.Expressions.Contracts; namespace Elsa.Workflows.Serialization.Converters; @@ -11,9 +12,9 @@ public class PolymorphicDictionaryConverter : JsonConverter _objectConverter; /// - public PolymorphicDictionaryConverter(JsonSerializerOptions options) + public PolymorphicDictionaryConverter(JsonSerializerOptions options, IWellKnownTypeRegistry wellKnownTypeRegistry) { - var factory = (JsonConverterFactory)(options.Converters.FirstOrDefault(x => x is PolymorphicObjectConverterFactory) ?? new PolymorphicObjectConverterFactory()); + var factory = (JsonConverterFactory)(options.Converters.FirstOrDefault(x => x is PolymorphicObjectConverterFactory) ?? new PolymorphicObjectConverterFactory(wellKnownTypeRegistry)); _objectConverter = (JsonConverter)factory.CreateConverter(typeof(object), options)!; } diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs index ef7e192fd..49eeeb940 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs @@ -1,10 +1,10 @@ using System.Collections; using System.Dynamic; using System.Reflection; -using System.Runtime; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; +using Elsa.Expressions.Contracts; using Elsa.Extensions; using Elsa.Workflows.Serialization.ReferenceHandlers; using Newtonsoft.Json.Linq; @@ -14,7 +14,7 @@ namespace Elsa.Workflows.Serialization.Converters; /// /// Reads objects as primitive types rather than values while also maintaining the .NET type name for reconstructing the actual type. /// -public class PolymorphicObjectConverter : JsonConverter +public class PolymorphicObjectConverter(IWellKnownTypeRegistry wellKnownTypeRegistry) : JsonConverter { private const string TypePropertyName = "_type"; private const string ItemsPropertyName = "_items"; @@ -23,11 +23,6 @@ public class PolymorphicObjectConverter : JsonConverter private const string RefPropertyName = "$ref"; private const string ValuesPropertyName = "$values"; - /// - public PolymorphicObjectConverter() - { - } - /// public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { @@ -145,10 +140,9 @@ public class PolymorphicObjectConverter : JsonConverter } else if (isHashSet) { - addSetMethod.Invoke(collection, new[] - { + addSetMethod.Invoke(collection, [ deserializedElement - }); + ]); } else if (collection is IList list) { @@ -250,13 +244,26 @@ public class PolymorphicObjectConverter : JsonConverter if (type != typeof(ExpandoObject)) { if (shouldWriteTypeField) - writer.WriteString(TypePropertyName, type.GetSimpleAssemblyQualifiedName()); + { + var typeOptions = newOptions.Clone(); + typeOptions.Converters.RemoveWhere(c => c.GetType() != typeof(TypeJsonConverter)); + + if (typeOptions.Converters.Any()) + { + var typeValue = JsonSerializer.Serialize(type, typeOptions).Trim('"'); + writer.WriteString(TypePropertyName, typeValue); + } + else + { + writer.WriteString(TypePropertyName, type.GetSimpleAssemblyQualifiedName()); + } + } } writer.WriteEndObject(); } - private static Type? ReadType(Utf8JsonReader reader) + private Type? ReadType(Utf8JsonReader reader) { reader.Read(); // Move to the first token inside the object. string? typeName = null; @@ -298,7 +305,7 @@ public class PolymorphicObjectConverter : JsonConverter } // If we found the _type property, attempt to resolve the type. - var targetType = typeName != null ? Type.GetType(typeName) : default; + var targetType = typeName != null ? wellKnownTypeRegistry.TryGetType(typeName, out var type) ? type : Type.GetType(typeName) : default; return targetType; } diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverterFactory.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverterFactory.cs index f304829c6..d50c29b88 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverterFactory.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverterFactory.cs @@ -1,13 +1,14 @@ using System.Dynamic; using System.Text.Json; using System.Text.Json.Serialization; +using Elsa.Expressions.Contracts; namespace Elsa.Workflows.Serialization.Converters; /// /// A JSON converter factory that creates instances. /// -public class PolymorphicObjectConverterFactory : JsonConverterFactory +public class PolymorphicObjectConverterFactory(IWellKnownTypeRegistry wellKnownTypeRegistry) : JsonConverterFactory { /// public override bool CanConvert(Type typeToConvert) @@ -24,8 +25,8 @@ public class PolymorphicObjectConverterFactory : JsonConverterFactory public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { if (typeof(IDictionary).IsAssignableFrom(typeToConvert)) - return new PolymorphicDictionaryConverter(options); + return new PolymorphicDictionaryConverter(options, wellKnownTypeRegistry); - return new PolymorphicObjectConverter(); + return new PolymorphicObjectConverter(wellKnownTypeRegistry); } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs index 48c462c00..3d71dd61c 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs @@ -113,7 +113,7 @@ public class JsonWorkflowStateSerializer : ConfigurableSerializer, IWorkflowStat options.Converters.Add(new JsonStringEnumConverter()); options.Converters.Add(new TypeJsonConverter(_wellKnownTypeRegistry)); options.Converters.Add(JsonMetadataServices.TimeSpanConverter); - options.Converters.Add(new PolymorphicObjectConverterFactory()); + options.Converters.Add(new PolymorphicObjectConverterFactory(_wellKnownTypeRegistry)); options.Converters.Add(new TypeJsonConverter(_wellKnownTypeRegistry)); options.Converters.Add(new VariableConverterFactory(_wellKnownTypeRegistry, _loggerFactory)); } diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayIsland.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayIsland.json index c957037c6..f78e01922 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayIsland.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayIsland.json @@ -4,5 +4,5 @@ "_island": "[\r\n {\r\n \u0022path\u0022: \u0022folder1\u0022,\r\n \u0022command\u0022: \u0022add\u0022\r\n }\r\n]", "_type": "Newtonsoft.Json.Linq.JArray, Newtonsoft.Json" }, - "_type": "System.Collections.Generic.Dictionary\u00602[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayWithoutType.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayWithoutType.json index 092ae42ec..42c531e42 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayWithoutType.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JArrayWithoutType.json @@ -6,5 +6,5 @@ "command": "add" } ], - "_type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectIsland.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectIsland.json index 033c4358d..ddc4af5d9 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectIsland.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectIsland.json @@ -4,5 +4,5 @@ "_island": "{\r\n \u0022file1\u0022: {\r\n \u0022script\u0022: [\r\n {\r\n \u0022path\u0022: \u0022folder1\u0022,\r\n \u0022command\u0022: \u0022add\u0022\r\n }\r\n ]\r\n }\r\n}", "_type": "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json" }, - "_type": "System.Collections.Generic.Dictionary\u00602[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectWithoutType.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectWithoutType.json index 02e25da4d..9a42638c9 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectWithoutType.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JObjectWithoutType.json @@ -10,5 +10,5 @@ ] } }, - "_type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonArrayIsland.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonArrayIsland.json index 95fedff19..1f33d0c25 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonArrayIsland.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonArrayIsland.json @@ -4,5 +4,5 @@ "_island": "[\r\n {\r\n \u0022path\u0022: \u0022folder1\u0022,\r\n \u0022command\u0022: \u0022add\u0022\r\n }\r\n]", "_type": "System.Text.Json.Nodes.JsonArray, System.Text.Json" }, - "_type": "System.Collections.Generic.Dictionary\u00602[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectIsland.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectIsland.json index 360177034..cc7a4135e 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectIsland.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectIsland.json @@ -4,5 +4,5 @@ "_island": "{\r\n \u0022file1\u0022: {\r\n \u0022script\u0022: [\r\n {\r\n \u0022path\u0022: \u0022folder1\u0022,\r\n \u0022command\u0022: \u0022add\u0022\r\n }\r\n ]\r\n }\r\n}", "_type": "System.Text.Json.Nodes.JsonObject, System.Text.Json" }, - "_type": "System.Collections.Generic.Dictionary\u00602[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectWithoutType.json b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectWithoutType.json index 14ce9e027..9a42638c9 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectWithoutType.json +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/JsonObjectWithoutType.json @@ -10,5 +10,5 @@ ] } }, - "_type": "System.Collections.Generic.Dictionary\u00602[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib" + "_type": "ObjectDictionary" } \ No newline at end of file diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs index a8ece496e..332333025 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs @@ -2,6 +2,7 @@ using System.Dynamic; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; +using Elsa.Expressions.Services; using Elsa.Workflows.Serialization.Converters; using Elsa.Workflows.Serialization.ReferenceHandlers; using Xunit; @@ -74,7 +75,6 @@ public class Tests private JsonSerializerOptions GetSerializerOptions() { var referenceHandler = new CrossScopedReferenceHandler(); - var options = new JsonSerializerOptions { ReferenceHandler = referenceHandler, @@ -85,7 +85,7 @@ public class Tests options.Converters.Add(new JsonStringEnumConverter()); options.Converters.Add(JsonMetadataServices.TimeSpanConverter); - options.Converters.Add(new PolymorphicObjectConverterFactory()); + options.Converters.Add(new PolymorphicObjectConverterFactory(new WellKnownTypeRegistry())); return options; } } \ No newline at end of file