From 55bacd8b20fc02d8118ae73f2f2a4d7af2e86e91 Mon Sep 17 00:00:00 2001 From: Vedika Gupta <52126954+VedikaGupt@users.noreply.github.com> Date: Sat, 7 Feb 2026 18:54:57 +0530 Subject: [PATCH] Fix PolymorphicObjectConverter handling of primitive values (#7207) * Fix PolymorphicObjectConverter handling of primitive values * Add integration test for polymorphic serialization of primitive values --------- Co-authored-by: Vedika Gupta --- .../Converters/PolymorphicObjectConverter.cs | 9 +++++++ .../Serialization/Polymorphism/Tests.cs | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+) 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