From ba4645ea62c63a1aa45f49ee4a38d9bab5de8e2f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 6 Jan 2025 15:34:43 +0100 Subject: [PATCH] Refactor JsonWorkflowStateSerializer to improve performance - **Improves performance:** The converters and static properties are pre-configured when the class is initialized. Only the `ReferenceHandler` is refreshed per call, avoiding repeated configuration of common options like converters. - **Thread-safe:** Since `_cachedOptions` is immutable, it can safely be reused across threads. **Tradeoffs:** Small performance cost during cloning, but still much faster than fully recreating options each time. --- .../JsonWorkflowStateSerializer.cs | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs index 90093d688..681893fca 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs @@ -129,29 +129,18 @@ public class JsonWorkflowStateSerializer : ConfigurableSerializer, IWorkflowStat /// public override JsonSerializerOptions GetOptions() { - // Bypass cached options to ensure that the reference handler is always fresh. - return GetOptionsInternal(); - } - - /// - protected override void Configure(JsonSerializerOptions options) - { - var referenceHandler = new CrossScopedReferenceHandler(); - - options.ReferenceHandler = referenceHandler; - options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - options.PropertyNameCaseInsensitive = true; - options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; + var options = base.GetOptions(); + return new JsonSerializerOptions(options) + { + ReferenceHandler = new CrossScopedReferenceHandler() + }; } /// protected override void AddConverters(JsonSerializerOptions options) { - options.Converters.Add(new JsonStringEnumConverter()); options.Converters.Add(new TypeJsonConverter(_wellKnownTypeRegistry)); - options.Converters.Add(JsonMetadataServices.TimeSpanConverter); options.Converters.Add(new PolymorphicObjectConverterFactory(_wellKnownTypeRegistry)); - options.Converters.Add(new TypeJsonConverter(_wellKnownTypeRegistry)); options.Converters.Add(new VariableConverterFactory(_wellKnownTypeRegistry, _loggerFactory)); } } \ No newline at end of file