diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs index 1c0baac30..d5deb003f 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs @@ -74,7 +74,7 @@ internal class Export : ElsaEndpoint foreach (var definition in definitions) { var model = await CreateWorkflowModelAsync(definition, cancellationToken); - var binaryJson = SerializeWorkflowDefinition(model); + var binaryJson = await SerializeWorkflowDefinitionAsync(model, cancellationToken); var fileName = GetFileName(model); var entry = zipArchive.CreateEntry(fileName, CompressionLevel.Optimal); await using var entryStream = entry.Open(); @@ -103,7 +103,7 @@ internal class Export : ElsaEndpoint } var model = await CreateWorkflowModelAsync(definition, cancellationToken); - var binaryJson = SerializeWorkflowDefinition(model); + var binaryJson = await SerializeWorkflowDefinitionAsync(model, cancellationToken); var fileName = GetFileName(model); await SendBytesAsync(binaryJson, fileName, cancellation: cancellationToken); @@ -117,10 +117,25 @@ internal class Export : ElsaEndpoint return fileName; } - private byte[] SerializeWorkflowDefinition(WorkflowDefinitionModel model) + private async Task SerializeWorkflowDefinitionAsync(WorkflowDefinitionModel model, CancellationToken cancellationToken) { - JsonSerializerOptions serializerOptions = _serializer.GetOptions(); - var binaryJson = JsonSerializer.SerializeToUtf8Bytes(model, serializerOptions); + var serializerOptions = _serializer.GetOptions(); + var document = JsonSerializer.SerializeToDocument(model, serializerOptions); + var rootElement = document.RootElement; + + using var output = new MemoryStream(); + await using var writer = new Utf8JsonWriter(output); + + writer.WriteStartObject(); + writer.WriteString("$schema", "https://elsaworkflows.io/schemas/workflow-definition/v3.0.0/schema.json"); + + foreach (var property in rootElement.EnumerateObject()) + property.WriteTo(writer); + + writer.WriteEndObject(); + + await writer.FlushAsync(cancellationToken); + var binaryJson = output.ToArray(); return binaryJson; } diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Configurators/AdditionalConvertersConfigurator.cs b/src/modules/Elsa.Workflows.Core/Serialization/Configurators/AdditionalConvertersConfigurator.cs index 6a5404312..da96c7e30 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Configurators/AdditionalConvertersConfigurator.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Configurators/AdditionalConvertersConfigurator.cs @@ -1,6 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using Elsa.Workflows.Serialization.Converters; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Workflows.Serialization.Configurators; @@ -8,23 +9,14 @@ namespace Elsa.Workflows.Serialization.Configurators; /// /// Add additional objects. /// -public class AdditionalConvertersConfigurator : SerializationOptionsConfiguratorBase +[UsedImplicitly] +public class AdditionalConvertersConfigurator(IServiceProvider serviceProvider) : SerializationOptionsConfiguratorBase { - private readonly IServiceProvider _serviceProvider; - - /// - /// Initializes a new instance of the class. - /// - public AdditionalConvertersConfigurator(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - /// public override void Configure(JsonSerializerOptions options) { options.Converters.Add(Create()); } - private T Create() => ActivatorUtilities.CreateInstance(_serviceProvider); + private T Create() => ActivatorUtilities.CreateInstance(serviceProvider); } \ No newline at end of file