Merge pull request #6272 from elsa-workflows/perf/serialization

Refactor JsonWorkflowStateSerializer to improve performance
This commit is contained in:
Sipke Schoorstra 2025-01-07 11:27:33 +01:00 committed by GitHub
commit ace32dd50e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 8 additions and 21 deletions

View file

@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>

View file

@ -108,7 +108,7 @@ internal class ImportFiles : ElsaEndpoint<WorkflowDefinitionModel>
private async Task ImportJsonStreamAsync(Stream jsonStream, CancellationToken cancellationToken)
{
var json = await new StreamReader(jsonStream).ReadToEndAsync();
var json = await new StreamReader(jsonStream).ReadToEndAsync(cancellationToken);
var model = _apiSerializer.Deserialize<WorkflowDefinitionModel>(json);
await ImportSingleWorkflowDefinitionAsync(model, cancellationToken);
}

View file

@ -1,7 +1,5 @@
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Elsa.Common.Serialization;
using Elsa.Expressions.Contracts;
using Elsa.Workflows.Serialization.Converters;
@ -129,29 +127,18 @@ public class JsonWorkflowStateSerializer : ConfigurableSerializer, IWorkflowStat
/// <inheritdoc />
public override JsonSerializerOptions GetOptions()
{
// Bypass cached options to ensure that the reference handler is always fresh.
return GetOptionsInternal();
}
/// <inheritdoc />
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()
};
}
/// <inheritdoc />
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));
}
}

View file

@ -36,7 +36,7 @@ namespace Elsa.Workflows.Management.Services
// Get a workflow draft version.
var draft = !string.IsNullOrWhiteSpace(definitionId)
? await _workflowDefinitionPublisher.GetDraftAsync(definitionId, VersionOptions.Latest, cancellationToken)
: default;
: null;
var isNew = draft == null;