< Summary

Information
Class: Elsa.Workflows.Serialization.Serializers.JsonWorkflowStateSerializer
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs
Line coverage
46%
Covered lines: 15
Uncovered lines: 17
Coverable lines: 32
Total lines: 142
Line coverage: 46.8%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
SerializeAsync(...)100%210%
SerializeToUtfBytesAsync(...)100%210%
SerializeToElementAsync(...)100%210%
SerializeAsync(...)100%210%
DeserializeAsync(...)100%210%
DeserializeAsync(...)100%210%
DeserializeAsync(...)100%210%
Serialize(...)100%11100%
SerializeToUtfBytes(...)100%210%
SerializeToElement(...)100%210%
Serialize(...)100%210%
Deserialize(...)100%11100%
Deserialize(...)100%210%
Deserialize(...)100%210%
GetOptions()100%11100%
AddConverters(...)100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Serialization/Serializers/JsonWorkflowStateSerializer.cs

#LineLine coverage
 1using System.Diagnostics.CodeAnalysis;
 2using System.Text.Json;
 3using Elsa.Common.Serialization;
 4using Elsa.Workflows.Serialization.Converters;
 5using Elsa.Workflows.Serialization.ReferenceHandlers;
 6using Elsa.Workflows.State;
 7using Microsoft.Extensions.Logging;
 8
 9namespace Elsa.Workflows.Serialization.Serializers;
 10
 11/// <summary>
 12/// Serializes and deserializes workflow states from and to JSON.
 13/// </summary>
 14public class JsonWorkflowStateSerializer : ConfigurableSerializer, IWorkflowStateSerializer
 15{
 16    private readonly ISerializationTypeRegistry _workflowJsonTypeRegistry;
 17    private readonly ILoggerFactory _loggerFactory;
 18
 19    /// <summary>
 20    /// Initializes a new instance of the <see cref="JsonWorkflowStateSerializer"/> class.
 21    /// </summary>
 22    public JsonWorkflowStateSerializer(IServiceProvider serviceProvider, ISerializationTypeRegistry workflowJsonTypeRegi
 12623        : base(serviceProvider)
 24    {
 12625        _workflowJsonTypeRegistry = workflowJsonTypeRegistry;
 12626        _loggerFactory = loggerFactory;
 12627    }
 28
 29    /// <inheritdoc />
 30    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The serialization process may require access
 31    [Obsolete("Use the non-async version Serialize instead.")]
 32    public Task<string> SerializeAsync(WorkflowState workflowState, CancellationToken cancellationToken = default)
 33    {
 034        return Task.FromResult(Serialize(workflowState));
 35    }
 36
 37    /// <inheritdoc />
 38    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The serialization process may require access
 39    [Obsolete("Use the non-async version SerializeToUtfBytes instead.")]
 40    public Task<byte[]> SerializeToUtfBytesAsync(WorkflowState workflowState, CancellationToken cancellationToken = defa
 41    {
 042        return Task.FromResult(SerializeToUtfBytes(workflowState));
 43    }
 44
 45    /// <inheritdoc />
 46    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The serialization process may require access
 47    [Obsolete("Use the non-async version SerializeToElement instead.")]
 48    public Task<JsonElement> SerializeToElementAsync(WorkflowState workflowState, CancellationToken cancellationToken = 
 49    {
 050        return Task.FromResult(SerializeToElement(workflowState));
 51    }
 52
 53    /// <inheritdoc />
 54    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The serialization process may require access
 55    [Obsolete("Use the non-async version Serialize instead.")]
 56    public Task<string> SerializeAsync(object workflowState, CancellationToken cancellationToken = default)
 57    {
 058        return Task.FromResult(Serialize(workflowState));
 59    }
 60
 61    /// <inheritdoc />
 62    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The deserialization process may require acce
 63    [Obsolete("Use the non-async version Deserialize instead.")]
 64    public Task<WorkflowState> DeserializeAsync(string serializedState, CancellationToken cancellationToken = default)
 65    {
 066        return Task.FromResult(Deserialize(serializedState));
 67    }
 68
 69    /// <inheritdoc />
 70    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The deserialization process may require acce
 71    [Obsolete("Use the non-async version Deserialize instead.")]
 72    public Task<WorkflowState> DeserializeAsync(JsonElement serializedState, CancellationToken cancellationToken = defau
 73    {
 074        return Task.FromResult(Deserialize(serializedState));
 75    }
 76
 77    /// <inheritdoc />
 78    [RequiresUnreferencedCode("The type 'T' may be trimmed from the output. The deserialization process may require acce
 79    [Obsolete("Use the non-async version Deserialize instead.")]
 80    public Task<T> DeserializeAsync<T>(string serializedState, CancellationToken cancellationToken = default)
 81    {
 082        return Task.FromResult(Deserialize<T>(serializedState));
 83    }
 84
 85    public string Serialize(WorkflowState workflowState)
 86    {
 41487        var options = GetOptions();
 41488        return JsonSerializer.Serialize(workflowState, options);
 89    }
 90
 91    public byte[] SerializeToUtfBytes(WorkflowState workflowState)
 92    {
 093        var options = GetOptions();
 094        return JsonSerializer.SerializeToUtf8Bytes(workflowState, options);
 95    }
 96
 97    public JsonElement SerializeToElement(WorkflowState workflowState)
 98    {
 099        var options = GetOptions();
 0100        return JsonSerializer.SerializeToElement(workflowState, options);
 101    }
 102
 103    public string Serialize(object workflowState)
 104    {
 0105        var options = GetOptions();
 0106        return JsonSerializer.Serialize(workflowState, workflowState.GetType(), options);
 107    }
 108
 109    public WorkflowState Deserialize(string serializedState)
 110    {
 111111        var options = GetOptions();
 111112        return JsonSerializer.Deserialize<WorkflowState>(serializedState, options)!;
 113    }
 114
 115    public WorkflowState Deserialize(JsonElement serializedState)
 116    {
 0117        var options = GetOptions();
 0118        return serializedState.Deserialize<WorkflowState>(options)!;
 119    }
 120
 121    public T Deserialize<T>(string serializedState)
 122    {
 0123        var options = GetOptions();
 0124        return JsonSerializer.Deserialize<T>(serializedState, options)!;
 125    }
 126
 127    /// <inheritdoc />
 128    public override JsonSerializerOptions GetOptions()
 129    {
 525130        var options = base.GetOptions();
 525131        return new(options) { ReferenceHandler = new CrossScopedReferenceHandler() };
 132    }
 133
 134    /// <inheritdoc />
 135    protected override void AddConverters(JsonSerializerOptions options)
 136    {
 1137        options.Converters.Add(new TypeJsonConverter(_workflowJsonTypeRegistry));
 1138        options.Converters.Add(new PolymorphicObjectConverterFactory(_workflowJsonTypeRegistry));
 1139        options.Converters.Add(new VariableConverterFactory(_workflowJsonTypeRegistry, _loggerFactory));
 1140        options.Converters.Add(new FuncExpressionValueConverter());
 1141    }
 142}