You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

serialization.md 2.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # 序列化
  2. CAP 提供了 `ISerializer` 接口来支持对消息进行序列化,默认情况下我们使用 json 来对消息进行序列化处理并存储到数据库中。
  3. ## 自定义序列化
  4. ```C#
  5. public class YourSerializer: ISerializer
  6. {
  7. Task<TransportMessage> SerializeAsync(Message message)
  8. {
  9. }
  10. Task<Message> DeserializeAsync(TransportMessage transportMessage, Type valueType)
  11. {
  12. }
  13. }
  14. ```
  15. 然后将你的实现注册到容器中:
  16. ```
  17. //注册你的自定义实现
  18. services.AddSingleton<ISerializer, YourSerializer>();
  19. // ---
  20. services.AddCap
  21. ```
  22. ## 消息适配器 (v3.0移除 )
  23. 在异构系统中,有时候需要和其他系统进行通讯,但是其他系统使用的消息对象可能和 CAP 的[**包装器对象**](../storage/general.md#_7)不一样,这个时候就需要对消息进行自定义适配。
  24. CAP 提供了 `IMessagePacker` 接口用于对 [**包装器对象**](../storage/general.md#_7) 进行自定义,自定义的 MessagePacker 通常是将 `CapMessage` 进行打包和解包操作,在这个过程中可以添加自己的业务对象。
  25. 使用方法:
  26. ```csharp
  27. class MyMessagePacker : IMessagePacker
  28. {
  29. private readonly IContentSerializer _serializer;
  30. public DefaultMessagePacker(IContentSerializer serializer)
  31. {
  32. _serializer = serializer;
  33. }
  34. public string Pack(CapMessage obj)
  35. {
  36. var myStructure = new
  37. {
  38. Id = obj.Id,
  39. Body = obj.Content,
  40. Date = obj.Timestamp,
  41. Callback = obj.CallbackName
  42. };
  43. return _serializer.Serialize(myStructure);
  44. }
  45. public CapMessage UnPack(string packingMessage)
  46. {
  47. var myStructure = _serializer.DeSerialize<MyStructure>(packingMessage);
  48. return new CapMessageDto
  49. {
  50. Id = myStructure.Id,
  51. Timestamp = myStructure.Date,
  52. Content = myStructure.Body,
  53. CallbackName = myStructure.Callback
  54. };
  55. }
  56. }
  57. ```
  58. 接下来,配置自定义的 `MyMessagePacker` 到服务中。
  59. ```csharp
  60. services.AddCap(x =>{ }).AddMessagePacker<MyMessagePacker>();
  61. ```