Skip to content

Commit

Permalink
Fix serialization of saga data (#512)
Browse files Browse the repository at this point in the history
* Failing test

* Instruct serializer to use actual type of serialized saga data
  • Loading branch information
DavidBoike committed Sep 18, 2024
1 parent 7aa5284 commit d54c644
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -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}}
{"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}
15 changes: 12 additions & 3 deletions src/NServiceBus.SagaAudit.Tests/SagaEntitySerialization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void Saga_entity_serializes_correctly()
}
};

var serialized = JsonSerializer.Serialize(entity);
var serialized = SerializeUsingBehavior(entity);

Approver.Verify(serialized);
}
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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; }
Expand All @@ -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
}
}
Expand Down
24 changes: 14 additions & 10 deletions src/NServiceBus.SagaAudit/CaptureSagaStateBehavior.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class CaptureSagaStateBehavior : Behavior<IInvokeHandlerContext>
Func<object, Dictionary<string, string>> customSagaEntitySerialization;
string endpointName;

CaptureSagaStateBehavior(string endpointName, ServiceControlBackend backend, Func<object, Dictionary<string, string>> customSagaEntitySerialization)
public CaptureSagaStateBehavior(string endpointName, ServiceControlBackend backend, Func<object, Dictionary<string, string>> customSagaEntitySerialization)
{
this.endpointName = endpointName;
this.backend = backend;
Expand Down Expand Up @@ -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;
Expand All @@ -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<string, string> headers, string messageId, string messageType)
{
headers.TryGetValue(Headers.OriginatingMachine, out var originatingMachine);
Expand Down

0 comments on commit d54c644

Please sign in to comment.