From d54c644c0fcb22b009b3ba6fbcacf09d2d19bac0 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 18 Sep 2024 11:23:32 -0500 Subject: [PATCH] Fix serialization of saga data (#512) * Failing test * Instruct serializer to use actual type of serialized saga data --- ...a_entity_serializes_correctly.approved.txt | 2 +- .../SagaEntitySerialization.cs | 15 +++++++++--- .../CaptureSagaStateBehavior.cs | 24 +++++++++++-------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/NServiceBus.SagaAudit.Tests/ApprovalFiles/SagaEntitySerialization.Saga_entity_serializes_correctly.approved.txt b/src/NServiceBus.SagaAudit.Tests/ApprovalFiles/SagaEntitySerialization.Saga_entity_serializes_correctly.approved.txt index 0999ac6..33f084e 100644 --- a/src/NServiceBus.SagaAudit.Tests/ApprovalFiles/SagaEntitySerialization.Saga_entity_serializes_correctly.approved.txt +++ b/src/NServiceBus.SagaAudit.Tests/ApprovalFiles/SagaEntitySerialization.Saga_entity_serializes_correctly.approved.txt @@ -1 +1 @@ -{"IntProperty":42,"StringProperty":"String","GuidProperty":"00000000-0000-0000-0000-000000000000","DateProperty":"2017-10-26T13:03:13Z","NullableDateProperty":"2013-10-26T13:03:13Z","TimeProperty":"1.02:03:04","NullableTimeProperty":"5.06:07:08","NestedObjectProperty":{"IntProperty":1}} \ No newline at end of file +{"IntProperty":42,"StringProperty":"String","GuidProperty":"00000000-0000-0000-0000-000000000000","DateProperty":"2017-10-26T13:03:13Z","NullableDateProperty":"2013-10-26T13:03:13Z","TimeProperty":"1.02:03:04","NullableTimeProperty":"5.06:07:08","NestedObjectProperty":{"IntProperty":1},"Id":"00000000-0000-0000-0000-000000000000","Originator":null,"OriginalMessageId":null} \ No newline at end of file diff --git a/src/NServiceBus.SagaAudit.Tests/SagaEntitySerialization.cs b/src/NServiceBus.SagaAudit.Tests/SagaEntitySerialization.cs index 0e7d7d9..fc04ed3 100644 --- a/src/NServiceBus.SagaAudit.Tests/SagaEntitySerialization.cs +++ b/src/NServiceBus.SagaAudit.Tests/SagaEntitySerialization.cs @@ -28,7 +28,7 @@ public void Saga_entity_serializes_correctly() } }; - var serialized = JsonSerializer.Serialize(entity); + var serialized = SerializeUsingBehavior(entity); Approver.Verify(serialized); } @@ -50,7 +50,7 @@ public void Saga_entity_compatible_with_serviceinsight() IntProperty = 1 } }; - var sagaDataJson = JsonSerializer.Serialize(entity); + var sagaDataJson = SerializeUsingBehavior(entity); var sagaDataProperties = JsonPropertiesHelper.ProcessValues(sagaDataJson); @@ -83,6 +83,13 @@ public void Saga_entity_compatible_with_serviceinsight() } } + + static string SerializeUsingBehavior(IContainSagaData data) + { + var behavior = new CaptureSagaStateBehavior("FakeEndpointName", null, null); + return behavior.SerializeSagaState(data); + } + string TrimWhitespaceAndNewLines(string value) { return value.Replace(Environment.NewLine, string.Empty).Replace(" ", string.Empty); @@ -93,7 +100,7 @@ public class NestedObject public int IntProperty { get; set; } } - public class SagaEntity + public class SagaEntity : ContainSagaData { public int IntProperty { get; set; } public string StringProperty { get; set; } @@ -105,7 +112,9 @@ public class SagaEntity public NestedObject NestedObjectProperty { get; set; } public static string StaticProperty { get; set; } = "test"; #pragma warning disable IDE0051 // Remove unused private members +#pragma warning disable NSB0007 // Saga data property is not writeable string PrivateProperty { get; set; } = "test"; +#pragma warning restore NSB0007 // Saga data property is not writeable #pragma warning restore IDE0051 // Remove unused private members } } diff --git a/src/NServiceBus.SagaAudit/CaptureSagaStateBehavior.cs b/src/NServiceBus.SagaAudit/CaptureSagaStateBehavior.cs index fc95c48..4246c39 100644 --- a/src/NServiceBus.SagaAudit/CaptureSagaStateBehavior.cs +++ b/src/NServiceBus.SagaAudit/CaptureSagaStateBehavior.cs @@ -17,7 +17,7 @@ class CaptureSagaStateBehavior : Behavior Func> customSagaEntitySerialization; string endpointName; - CaptureSagaStateBehavior(string endpointName, ServiceControlBackend backend, Func> customSagaEntitySerialization) + public CaptureSagaStateBehavior(string endpointName, ServiceControlBackend backend, Func> customSagaEntitySerialization) { this.endpointName = endpointName; this.backend = backend; @@ -54,15 +54,7 @@ Task AuditSaga(ActiveSagaInstance activeSagaInstance, SagaUpdatedMessage sagaAud var saga = activeSagaInstance.Instance; - string sagaStateString; - if (customSagaEntitySerialization != null) - { - sagaStateString = JsonSerializer.Serialize(customSagaEntitySerialization(saga.Entity)); - } - else - { - sagaStateString = JsonSerializer.Serialize(saga.Entity); - } + string sagaStateString = SerializeSagaState(saga.Entity); var messageType = context.MessageMetadata.MessageType.FullName; var headers = context.MessageHeaders; @@ -83,6 +75,18 @@ Task AuditSaga(ActiveSagaInstance activeSagaInstance, SagaUpdatedMessage sagaAud return backend.Send(sagaAudit, transportTransaction, context.CancellationToken); } + internal string SerializeSagaState(IContainSagaData sagaData) + { + if (customSagaEntitySerialization != null) + { + return JsonSerializer.Serialize(customSagaEntitySerialization(sagaData)); + } + else + { + return JsonSerializer.Serialize(sagaData, sagaData.GetType()); + } + } + internal static SagaChangeInitiator BuildSagaChangeInitiatorMessage(IReadOnlyDictionary headers, string messageId, string messageType) { headers.TryGetValue(Headers.OriginatingMachine, out var originatingMachine);