Custom Codec

Altruist ships with JSON and MessagePack codecs. Add your own (Protobuf, FlatBuffers, etc.) by implementing ICodec.

Implement ICodec

[Service(typeof(ICodec))]
[CodecProvider("protobuf")]
[ConditionalOnConfig("altruist:server:transport:codec:provider", havingValue: "protobuf")]
public class ProtobufCodec : ICodec
{
    public IEncoder Encoder { get; } = new ProtobufEncoder();
    public IDecoder Decoder { get; } = new ProtobufDecoder();
}
AttributePurpose
[Service(typeof(ICodec))]Registers as the default codec
[CodecProvider("protobuf")]Names it for per-transport override resolution
[ConditionalOnConfig(...)]Only activates when config matches

Implement Encoder and Decoder

public class ProtobufEncoder : IEncoder
{
    public byte[] Encode<T>(T message)
    {
        using var stream = new MemoryStream();
        Serializer.Serialize(stream, message);
        return stream.ToArray();
    }

    public byte[] Encode(object message, Type type)
    {
        using var stream = new MemoryStream();
        Serializer.NonGeneric.Serialize(stream, message);
        return stream.ToArray();
    }
}

public class ProtobufDecoder : IDecoder
{
    public T Decode<T>(byte[] message)
    {
        using var stream = new MemoryStream(message);
        return Serializer.Deserialize<T>(stream);
    }

    public T Decode<T>(byte[] message, Type type)
    {
        using var stream = new MemoryStream(message);
        return (T)Serializer.NonGeneric.Deserialize(type, stream);
    }

    public object Decode(byte[] message, Type type)
    {
        using var stream = new MemoryStream(message);
        return Serializer.NonGeneric.Deserialize(type, stream);
    }
}

Config

# As global default
transport:
  codec:
    provider: protobuf

# Or per-transport override
transport:
  codec:
    provider: json
  tcp:
    enabled: true
    port: 13000
    codec:
      provider: protobuf    # TCP uses your custom codec

Note:

See Encoding & Decoding for the built-in codecs and per-transport override details.