# Custom serializers ### Create a custom serializer A custom serializer needs to implement the `IMessageSerializer` interface: ```cs class MyCustomSerializerDefinition : SerializationDefinition { public const string Key = "MyCustomSerializer.Settings"; public override Func Configure(IReadOnlySettings settings) { return mapper => { var value = settings.GetOrDefault(Key); return new MyCustomSerializer(value); }; } } class MyCustomSerializer : IMessageSerializer { public MyCustomSerializer(string settingsValue) { // Add code initializing serializer on the basis of settingsValue } public void Serialize(object message, Stream stream) { // Add code to serialize message throw new NotImplementedException(); } public object[] Deserialize(ReadOnlyMemory body, IList messageTypes = null) { // Add code to deserialize message throw new NotImplementedException(); } public string ContentType { get { throw new NotImplementedException(); } } } static class MyCustomSerializerConfigurationExtensions { public static void Settings(this SerializationExtensions config, string value) { var settingsHolder = config.GetSettings(); settingsHolder.Set(MyCustomSerializerDefinition.Key, value); } } ``` ### Register the serializer To use the customer serializer, it must be registered as part of the endpoint configuration: ```cs // register serializer additionally configuring settings var serialization = endpointConfiguration.UseSerialization(); serialization.Settings("settingsValue"); ``` > [!NOTE] > When using multiple deserializers, make sure that there's only one type registered per given `ContentType`.