From a6783256f48672eaf80ca87826806a19901cc20b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 12 Feb 2024 19:26:00 +0100 Subject: [PATCH] Update expression serialization and deserialization Refined the expression serialization context and its deserialization method for more extensive usage. Also, simplified the handling of value retrieval in the DefaultExpressionDescriptorProvider. This allows greater control over serialization processes and makes the code more concise. --- .../Models/ExpressionDescriptor.cs | 19 +++++++++++++++++-- .../Models/ExpressionSerializationContext.cs | 5 ++++- .../Converters/InputJsonConverter.cs | 2 +- .../DefaultExpressionDescriptorProvider.cs | 18 +++++++----------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/modules/Elsa.Expressions/Models/ExpressionDescriptor.cs b/src/modules/Elsa.Expressions/Models/ExpressionDescriptor.cs index 8f4220660..b63ac9d7a 100644 --- a/src/modules/Elsa.Expressions/Models/ExpressionDescriptor.cs +++ b/src/modules/Elsa.Expressions/Models/ExpressionDescriptor.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using Elsa.Expressions.Contracts; namespace Elsa.Expressions.Models; @@ -7,6 +8,20 @@ namespace Elsa.Expressions.Models; /// public class ExpressionDescriptor { + /// + /// Initializes a new instance of the class. + /// + public ExpressionDescriptor() + { + // Default deserialization function. + Deserialize = context => + { + return context.JsonElement.ValueKind == JsonValueKind.Object + ? context.JsonElement.Deserialize((JsonSerializerOptions?)context.Options)! + : new Expression(context.ExpressionType, null!); + }; + } + /// /// Gets or sets the syntax name. /// @@ -41,9 +56,9 @@ public class ExpressionDescriptor /// Gets or sets the memory block reference factory. /// public Func MemoryBlockReferenceFactory { get; set; } = () => new MemoryBlockReference(); - + /// /// Gets or sets the expression deserialization function. /// - public Func Deserialize { get; set; } = default!; + public Func Deserialize { get; set; } = default!; } \ No newline at end of file diff --git a/src/modules/Elsa.Expressions/Models/ExpressionSerializationContext.cs b/src/modules/Elsa.Expressions/Models/ExpressionSerializationContext.cs index f366531b4..d5da5c2c8 100644 --- a/src/modules/Elsa.Expressions/Models/ExpressionSerializationContext.cs +++ b/src/modules/Elsa.Expressions/Models/ExpressionSerializationContext.cs @@ -2,4 +2,7 @@ using System.Text.Json; namespace Elsa.Expressions.Models; -public record ExpressionSerializationContext(JsonElement JsonElement, JsonSerializerOptions Options, Type MemoryBlockType); \ No newline at end of file +/// +/// Defines the context for expression serialization. +/// +public record ExpressionSerializationContext(string ExpressionType, JsonElement JsonElement, JsonSerializerOptions Options, Type MemoryBlockType); \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs index d259b0deb..f311ec8c5 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs @@ -47,7 +47,7 @@ public class InputJsonConverter : JsonConverter> return default!; var memoryBlockType = memoryBlockReference.GetType(); - var context = new ExpressionSerializationContext(expressionElement, options, memoryBlockType); + var context = new ExpressionSerializationContext(expressionTypeName!, expressionElement, options, memoryBlockType); var expression = expressionDescriptor!.Deserialize(context); return (Input)Activator.CreateInstance(typeof(Input), expression, memoryBlockReference)!; diff --git a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs index df80d1ce9..86076cee7 100644 --- a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs +++ b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs @@ -62,9 +62,9 @@ public class DefaultExpressionDescriptorProvider : IExpressionDescriptorProvider memoryBlockReferenceFactory: () => new Variable(), deserialize: context => { - var expressionValueElement = context.JsonElement.TryGetProperty("value", out var expressionElementValueValue) ? expressionElementValueValue : default; - var expressionValue = expressionValueElement.Deserialize(context.MemoryBlockType, context.Options); - return new Expression("Variable", expressionValue); + var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default; + var value = valueElement.Deserialize(context.MemoryBlockType, context.Options); + return new Expression("Variable", value); } ); } @@ -86,16 +86,12 @@ public class DefaultExpressionDescriptorProvider : IExpressionDescriptorProvider IsSerializable = isSerializable, IsBrowsable = isBrowsable, HandlerFactory = sp => ActivatorUtilities.GetServiceOrCreateInstance(sp), - MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference()), - Deserialize = deserialize ?? - (context => - { - return context.JsonElement.ValueKind == JsonValueKind.Object - ? context.JsonElement.Deserialize((JsonSerializerOptions?)context.Options)! - : new Expression(expressionType, null!); - }) + MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference()) }; + if (deserialize != null) + descriptor.Deserialize = deserialize; + if (monacoLanguage != null) descriptor.Properties = new {