|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # 序列化
-
- CAP 提供了 `ISerializer` 接口来支持对消息进行序列化,默认情况下我们使用 json 来对消息进行序列化处理并存储到数据库中。
-
- ## 自定义序列化
-
- ```C#
- public class YourSerializer: ISerializer
- {
- Task<TransportMessage> SerializeAsync(Message message)
- {
-
- }
-
- Task<Message> DeserializeAsync(TransportMessage transportMessage, Type valueType)
- {
-
- }
- }
- ```
-
- 然后将你的实现注册到容器中:
-
- ```
-
- //注册你的自定义实现
- services.AddSingleton<ISerializer, YourSerializer>();
-
- // ---
- services.AddCap
-
- ```
-
-
- ## 消息适配器 (v3.0移除 )
-
- 在异构系统中,有时候需要和其他系统进行通讯,但是其他系统使用的消息对象可能和 CAP 的[**包装器对象**](../storage/general.md#_7)不一样,这个时候就需要对消息进行自定义适配。
-
- CAP 提供了 `IMessagePacker` 接口用于对 [**包装器对象**](../storage/general.md#_7) 进行自定义,自定义的 MessagePacker 通常是将 `CapMessage` 进行打包和解包操作,在这个过程中可以添加自己的业务对象。
-
- 使用方法:
-
- ```csharp
-
- 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` 到服务中。
-
- ```csharp
-
- services.AddCap(x =>{ }).AddMessagePacker<MyMessagePacker>();
-
- ```
|