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();
}
| Attribute | Purpose |
|---|---|
[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.