diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs index 838dae398..f4c280f97 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs @@ -242,6 +242,15 @@ public class PolymorphicObjectConverter : JsonConverter return; } + // If the value was serialized as a primitive by another converter, + // write it directly instead of assuming an object structure. + if (jsonElement.ValueKind != JsonValueKind.Object && + jsonElement.ValueKind != JsonValueKind.Array) + { + jsonElement.WriteTo(writer); + return; + } + writer.WriteStartObject(); if (jsonElement.ValueKind == JsonValueKind.Array) diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs index fefa1734d..6278555f8 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/Polymorphism/Tests.cs @@ -87,4 +87,30 @@ public class Tests options.Converters.Add(new PolymorphicObjectConverterFactory(new WellKnownTypeRegistry())); return options; } + + [Fact(DisplayName = "Types with custom converters that serialize to primitives are serialized as primitives")] + + public void CustomConverterProducingPrimitive_IsSerializedAsPrimitive() + { + var model = new MyNumber { Number = 123UL }; + var options = GetSerializerOptions(); + var expectedJson = "123"; + var json = JsonSerializer.Serialize(model, options); + Assert.Equal(expectedJson, json); + } + + [JsonConverter(typeof(MyNumberConverter))] + private struct MyNumber + { + public ulong Number { get; init; } + } + + private class MyNumberConverter : JsonConverter + { + public override MyNumber Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + => new() { Number = reader.GetUInt64() }; + + public override void Write(Utf8JsonWriter writer, MyNumber value, JsonSerializerOptions options) + => writer.WriteNumberValue(value.Number); + } } \ No newline at end of file