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