elsa-workflows / elsa-workflows/elsa-core
[BUG] Variable evaluation does not use custom JsonConverters that were registered
- Dominant language
- C#
- Stars
- 7.9k
- Forks
- 1.5k
- Avg merge
- 15h 22m
- Merged PRs (30d)
- 114
Description
## Description
If you attempt to use a custom type as a variable in the workflow will blow up during deserialization.
## Steps to Reproduce
Create a new type, like a string primitive and use it as a parameter. Try to run the workflow and it will throw an exception
1. **Detailed Steps**: Provide a step-by-step description of what leads to the bug. Be as specific as possible.
1. Create a custom type that requires a custom json converter to load
1. Add that type as an Input
1. Run the workflow
2. **Code Snippets**:
**Type**:
```cs
public struct AbsolutePath
{
public string Value { get; }
public AbsolutePath(string value)
{
Value = value;
}
}
```
**Conveter**
```cs
public class AbsolutePathJsonConverter : JsonConverter
{
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.Value);
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> new AbsolutePath(reader.GetString());
}
````
**Register the converter**
```cs
public class CustomSerializationOptionsConfiguratorBase : SerializationOptionsConfiguratorBase
{
{
public override void Configure(JsonSerializerOptions options)
{
options.Converters.Add(new AbsolutePathJsonConverter());
}
}
```
**Add it to elsa**
```cs
public class MyFeature : FeatureBase
{
public override void Apply()
{
Services.AddSerializationOptionsConfigurator();
}
}
```
4. **Reproduction Rate**: 100% of the time
## Expected Behavior
The type should be deserailized using the registered converters
## Actual Behavior
The `VariableExtensions` class has a hard coded serializer option that the users are unable to modify. It uses the default converter which fails.
## Log Output
**CallStack:**
```log
at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.Converters.NullableConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, Nullable`1& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsObject(Utf8JsonReader& reader, ReadStack& state)
at System.Text.Json.JsonSerializer.ReadFromSpanAsObject(ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
at System.Text.Json.JsonSerializer.ReadFromSpanAsObject(ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
at System.Text.Json.JsonSerializer.Deserialize(String json, Type returnType, JsonSerializerOptions options)
at Elsa.Expressions.Helpers.ObjectConverter.ConvertTo(Object value, Type targetType, ObjectConverterOptions converterOptions)"
```
Contributor guide
Assessment
This issue has not been assessed yet.