Skip to content

序列化

CAP 目前还不支持消息本身的序列化,在将消息发送到消息队列之前 CAP 使用 json 对消息对象进行序列化。

内容序列化

CAP 支持对消息的 Content 字段进行序列化,你可以自定义 IContentSerializer 接口来做到这一点。

目前由于消息对象需要进行数据库存储,所以只支持 string 的序列化和反序例化。

class MyContentSerializer : IContentSerializer 
{
    public T DeSerialize<T>(string messageObjStr)
    {
    }

    public object DeSerialize(string content, Type type)
    {
    }

    public string Serialize<T>(T messageObj)
    {
    }
}

消息适配器

在异构系统中,有时候需要和其他系统进行通讯,但是其他系统使用的消息对象可能和 CAP 的包装器对象不一样,这个时候就需要对消息进行自定义适配。

CAP 提供了 IMessagePacker 接口用于对 包装器对象 进行自定义,自定义的 MessagePacker 通常是将 CapMessage 进行打包和解包操作,在这个过程中可以添加自己的业务对象。

使用方法:

class MyMessagePacker : IMessagePacker
{
    private readonly IContentSerializer _serializer;

    public DefaultMessagePacker(IContentSerializer serializer)
    {
        _serializer = serializer;
    }

    public string Pack(CapMessage obj)
    {
        var myStructure = new
        {
            Id = obj.Id,
            Body = obj.Content,
            Date = obj.Timestamp,
            Callback = obj.CallbackName
        };
        return _serializer.Serialize(myStructure);
    }

    public CapMessage UnPack(string packingMessage)
    {
        var myStructure = _serializer.DeSerialize<MyStructure>(packingMessage);

        return new CapMessageDto
        {
            Id = myStructure.Id,
            Timestamp = myStructure.Date,
            Content = myStructure.Body,
            CallbackName = myStructure.Callback
        };
    }
}

接下来,配置自定义的 MyMessagePacker 到服务中。

services.AddCap(x =>{  }).AddMessagePacker<MyMessagePacker>();