# Multiple Deserializers This sample uses the `AddDeserializer` API to illustrate a receiving endpoint deserializing multiple serialization formats. ## Sending endpoints There are multiple sending endpoints, one per serializer. ### NewtonsoftJsonEndpoint Sends messages using the external [Json.NET serializer](/nservicebus/serialization/newtonsoft.md) in JSON format. ```cs var endpointConfiguration = new EndpointConfiguration("Samples.MultipleDeserializers.ExternalNewtonsoftJsonEndpoint"); var serialization = endpointConfiguration.UseSerialization(); serialization.ContentTypeKey("NewtonsoftJson"); endpointConfiguration.RegisterOutgoingMessageLogger(); ``` ### NewtonsoftBsonEndpoint Sends messages using the external [Json.NET serializer](/nservicebus/serialization/newtonsoft.md) in BSON format. ```cs var endpointConfiguration = new EndpointConfiguration("Samples.MultipleDeserializers.ExternalNewtonsoftBsonEndpoint"); var serialization = endpointConfiguration.UseSerialization(); serialization.ReaderCreator(stream => new BsonDataReader(stream)); serialization.WriterCreator(stream => new BsonDataWriter(stream)); serialization.ContentTypeKey("NewtonsoftBson"); endpointConfiguration.RegisterOutgoingMessageLogger(); ``` ### XmlEndpoint Sends messages using the [XML serializer](/nservicebus/serialization/xml.md). ```cs var endpointConfiguration = new EndpointConfiguration("Samples.MultipleDeserializers.XmlEndpoint"); endpointConfiguration.UseSerialization(); endpointConfiguration.RegisterOutgoingMessageLogger(); ``` ### SystemJsonEndpoint Sends messages using [System.Text.Json](/nservicebus/serialization/system-json.md) in JSON format. ```cs var endpointConfiguration = new EndpointConfiguration("Samples.MultipleDeserializers.SystemJsonEndpoint"); endpointConfiguration.UseSerialization(); endpointConfiguration.RegisterOutgoingMessageLogger(); ``` ## Shared Contains message definitions and a [message mutator](/nservicebus/pipeline/message-mutators.md) that logs the outgoing data. The project is shared by all endpoints and configured by `endpointConfiguration.RegisterOutgoingMessageLogger();` in the above snippets. ```cs class OutgoingMessageBodyWriter : IMutateOutgoingTransportMessages { static ILog log = LogManager.GetLogger(); public Task MutateOutgoing(MutateOutgoingTransportMessageContext context) { var bodyAsString = Encoding.UTF8 .GetString(context.OutgoingBody.ToArray()); log.Info($"Serialized Message Body:\r\n{bodyAsString}"); return Task.CompletedTask; } } public static class OutgoingMessageBodyWriterHelper { public static void RegisterOutgoingMessageLogger(this EndpointConfiguration endpointConfiguration) { // Register the mutator so the message on the wire is written endpointConfiguration.RegisterMessageMutator(new OutgoingMessageBodyWriter()); } } ``` ## ReceivingEndpoint The receiving endpoint references all the serializers used above and adds them using `AddDeserializer` ```cs var endpointConfiguration = new EndpointConfiguration("Samples.MultipleDeserializers.ReceivingEndpoint"); // Xml endpointConfiguration.UseSerialization(); // Json endpointConfiguration.AddDeserializer(); // External Newtonsoft Json var externalNewtonsoftJson = endpointConfiguration.AddDeserializer(); externalNewtonsoftJson.ContentTypeKey("NewtonsoftJson"); // External Newtonsoft Bson var externalNewtonsoftBson = endpointConfiguration.AddDeserializer(); externalNewtonsoftBson.ReaderCreator(stream => new BsonDataReader(stream)); externalNewtonsoftBson.WriterCreator(stream => new BsonDataWriter(stream)); externalNewtonsoftBson.ContentTypeKey("NewtonsoftBson"); // Register the mutator so the message on the wire is written builder.Services.AddSingleton(); var serviceProvider = builder.Services.BuildServiceProvider(); var incomingMessageBodyWriter = serviceProvider.GetRequiredService(); endpointConfiguration.RegisterMessageMutator(incomingMessageBodyWriter); ``` There is also a [message mutator](/nservicebus/pipeline/message-mutators.md) that logs the incoming data. ```cs public class IncomingMessageBodyWriter(ILogger logger) : IMutateIncomingTransportMessages, IIncomingMessageBodyWriter { public Task MutateIncoming(MutateIncomingTransportMessageContext context) { var bodyAsString = Encoding.UTF8 .GetString(context.Body.ToArray()); var contentType = context.Headers[Headers.ContentType]; logger.LogInformation("ContentType '{ContentType}'. Serialized Message Body:\r\n{Body}", contentType, bodyAsString); return Task.CompletedTask; } } ```