diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings
index d88a97a28..19414abf6 100644
--- a/Elsa.sln.DotSettings
+++ b/Elsa.sln.DotSettings
@@ -4,6 +4,7 @@
1
False
True
+ UI
True
True
True
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverter.cs
similarity index 99%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverter.cs
index dd52d01de..1a59fdf26 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverter.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverter.cs
@@ -10,7 +10,7 @@ using Elsa.Workflows.Models;
using Humanizer;
using Microsoft.Extensions.Logging;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// (De)serializes objects of type .
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverterFactory.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverterFactory.cs
similarity index 94%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverterFactory.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverterFactory.cs
index 9cca6e3a2..7baa83d7d 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/ActivityJsonConverterFactory.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverterFactory.cs
@@ -3,7 +3,7 @@ using System.Text.Json.Serialization;
using Elsa.Workflows.Contracts;
using Microsoft.Extensions.DependencyInjection;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// Creates instances of .
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs
similarity index 98%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverter.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs
index fdf2e229b..abd643cd7 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverter.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs
@@ -5,7 +5,7 @@ using Elsa.Expressions.Helpers;
using Elsa.Expressions.Models;
using Elsa.Workflows.Models;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// Serializes objects.
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverterFactory.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverterFactory.cs
similarity index 94%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverterFactory.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverterFactory.cs
index 144edb67d..9fa8a20bc 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/InputJsonConverterFactory.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverterFactory.cs
@@ -3,7 +3,7 @@ using System.Text.Json.Serialization;
using Elsa.Workflows.Models;
using Microsoft.Extensions.DependencyInjection;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// A JSON converter factory that creates instances.
diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonIgnoreCompositeRootConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonIgnoreCompositeRootConverter.cs
index aaf442e44..dfd7072b8 100644
--- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonIgnoreCompositeRootConverter.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/JsonIgnoreCompositeRootConverter.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -18,6 +19,7 @@ public class JsonIgnoreCompositeRootConverter : JsonConverter
}
///
+ [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")]
public override void Write(Utf8JsonWriter writer, IActivity? value, JsonSerializerOptions options)
{
writer.WriteStartObject();
@@ -35,7 +37,15 @@ public class JsonIgnoreCompositeRootConverter : JsonConverter
var propName = options.PropertyNamingPolicy?.ConvertName(property.Name) ?? property.Name;
writer.WritePropertyName(propName);
- JsonSerializer.Serialize(writer, property.GetValue(value), newOptions);
+ var input = property.GetValue(value);
+
+ if (input == null)
+ {
+ writer.WriteNullValue();
+ continue;
+ }
+
+ JsonSerializer.Serialize(writer, input, newOptions);
}
writer.WriteEndObject();
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverter.cs
similarity index 97%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverter.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverter.cs
index a78444c71..ecefa40b6 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverter.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverter.cs
@@ -5,7 +5,7 @@ using Elsa.Expressions.Extensions;
using Elsa.Workflows.Memory;
using Elsa.Workflows.Models;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// Serializes objects.
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverterFactory.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverterFactory.cs
similarity index 94%
rename from src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverterFactory.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverterFactory.cs
index 48dcc1dbf..752198fa9 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/Converters/OutputJsonConverterFactory.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/OutputJsonConverterFactory.cs
@@ -3,7 +3,7 @@ using System.Text.Json.Serialization;
using Elsa.Workflows.Models;
using Microsoft.Extensions.DependencyInjection;
-namespace Elsa.Workflows.Management.Serialization.Converters;
+namespace Elsa.Workflows.Serialization.Converters;
///
/// A JSON converter factory that creates instances.
diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonActivitySerializer.cs b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonActivitySerializer.cs
index a8b260ff3..7ce83bb14 100644
--- a/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonActivitySerializer.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonActivitySerializer.cs
@@ -44,5 +44,6 @@ public class JsonActivitySerializer : ConfigurableSerializer, IActivitySerialize
protected override void AddConverters(JsonSerializerOptions options)
{
options.Converters.Add(CreateInstance());
+ options.Converters.Add(CreateInstance());
}
}
\ No newline at end of file
diff --git a/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/SerializationOptionsConfigurator.cs
similarity index 89%
rename from src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs
rename to src/modules/Elsa.Workflows.Core/Serialization/Serializers/SerializationOptionsConfigurator.cs
index 0a35ebc6b..53a3d7e26 100644
--- a/src/modules/Elsa.Workflows.Management/Serialization/SerializationOptionsConfigurator.cs
+++ b/src/modules/Elsa.Workflows.Core/Serialization/Serializers/SerializationOptionsConfigurator.cs
@@ -1,8 +1,8 @@
using System.Text.Json;
-using Elsa.Workflows.Management.Serialization.Converters;
+using Elsa.Workflows.Serialization.Converters;
using Microsoft.Extensions.DependencyInjection;
-namespace Elsa.Workflows.Management.Serialization;
+namespace Elsa.Workflows.Serialization.Serializers;
///
/// Configures the JSON serialization options with support for serializing and deserializing activities and expressions.
diff --git a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs
index df1288171..e703e9444 100644
--- a/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs
+++ b/src/modules/Elsa.Workflows.Management/Features/WorkflowManagementFeature.cs
@@ -20,8 +20,8 @@ using Elsa.Workflows.Management.Materializers;
using Elsa.Workflows.Management.Models;
using Elsa.Workflows.Management.Options;
using Elsa.Workflows.Management.Providers;
-using Elsa.Workflows.Management.Serialization;
using Elsa.Workflows.Management.Services;
+using Elsa.Workflows.Serialization.Serializers;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
diff --git a/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Tests.cs b/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Tests.cs
new file mode 100644
index 000000000..63b7cd54b
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Tests.cs
@@ -0,0 +1,40 @@
+using Elsa.Extensions;
+using Elsa.Testing.Shared;
+using Elsa.Workflows.Contracts;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace Elsa.IntegrationTests.Serialization.ProgrammaticWorkflowsAndDelegates;
+
+///
+/// Contains tests for variable expressions serialization.
+///
+public class Tests
+{
+ private readonly IActivitySerializer _activitySerializer;
+ private readonly IWorkflowBuilder _workflowBuilder;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public Tests(ITestOutputHelper testOutputHelper)
+ {
+ var serviceProvider = new TestApplicationBuilder(testOutputHelper).Build();
+ _activitySerializer = serviceProvider.GetRequiredService();
+ var workflowBuilderFactory = serviceProvider.GetRequiredService();
+ _workflowBuilder = workflowBuilderFactory.CreateBuilder();
+ }
+
+ ///
+ /// Tests that programmatic workflows with inputs using delegates do not throw exceptions when serialized.
+ ///
+ [Fact(DisplayName = "Programmatic workflows with inputs using delegates do not throw exceptions when serialized")]
+ public async Task Test1()
+ {
+ var workflow = await _workflowBuilder.BuildWorkflowAsync();
+ var serializedWorkflow = _activitySerializer.Serialize(workflow);
+
+ // If it reached here, the test passed
+ }
+}
\ No newline at end of file
diff --git a/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Workflows.cs b/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Workflows.cs
new file mode 100644
index 000000000..e813908ee
--- /dev/null
+++ b/test/integration/Elsa.IntegrationTests/Serialization/ProgrammaticWorkflowsAndDelegates/Workflows.cs
@@ -0,0 +1,20 @@
+using Elsa.Extensions;
+using Elsa.Workflows;
+using Elsa.Workflows.Activities;
+using Elsa.Workflows.Contracts;
+
+namespace Elsa.IntegrationTests.Serialization.ProgrammaticWorkflowsAndDelegates;
+
+///
+public class GreeterWorkflow : WorkflowBase
+{
+ ///
+ protected override void Build(IWorkflowBuilder builder)
+ {
+ var messageInput = builder.WithInput("Message", "The message to write to the console.");
+
+ builder.Name = "Greeter Workflow";
+ builder.Inputs.Add(messageInput);
+ builder.Root = new WriteLine(context => context.GetInput(messageInput));
+ }
+}
\ No newline at end of file