在 EventStore/EventHub 中序列化/反序列化消息

本文关键字:反序列化 消息 序列化 EventHub EventStore | 更新日期: 2023-09-27 18:34:50

如果事件/消息的生产者和使用者都是基于.Net/C#的,我倾向于在有效负载中使用元数据,以便能够将数据反序列化为C# POCO,如下所示:

Data
{
  "X": {
    "a": "bb811ea5-6993-e511-80fc-1458d043a750",
    "b": "ddd",
    "b": "dddd",
    "d": true
  }
  "x1": 1.1234,
  "x2": 2.3456,
  "EventUtcDateTime": "2016-02-16T08:55:38.5103574Z"
}
Metadata
{
  "TimeStamp": "02/16/2016 08:55:37",
  "EventClrTypeName": "Bla.Di.Bla.SomeClass, Bla.Di.Bla, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
}

在生产者不是基于 .Net/C# 的情况下,什么是好的解决方案?

在 EventStore/EventHub 中序列化/反序列化消息

EventData 类包含一个属性 属性...允许您向消息添加元数据:

获取用户在发送操作期间显式添加的事件数据的用户属性。

所以要发送一个事件:

var eventHubClient = EventHubClient.CreateFromConnectionString("connectionString", "eventHubName");
var mypoco = new POCO();
// ...
// Get the Json string
var stringBody = JsonConvert.SerializeObject(mypoco);
// Create the event data
var eventData = new EventData(Encoding.UTF8.GetBytes(stringBody));
// Add the event type.
eventData.Properties.Add("EventType", typeof(POCO).Assembly.FullName);
// Send the data.
eventHubClient.Send(eventData);

接收消息时,您将从消息的元中获取事件类型:

async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (EventData eventData in messages)
    {
        var jsonBody = Encoding.UTF8.GetString(eventData.GetBytes());
        //Get the event type
        var eventTypeName = (string)eventData.Properties["EventType"];
        var eventType = Type.GetType(eventTypeName);
        // Deserialize the object
        var myPoco = JsonConvert.DeserializeObject(jsonBody, eventType);
    }
}

否则,您可以使用JObject摆脱体型

async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
{
    foreach (EventData eventData in messages)
    {
        var jsonBody = Encoding.UTF8.GetString(eventData.GetBytes());
        // Deserialize the json as a JObject
        var myPoco = JObject.Parse(jsonBody);
        var a = myPoco["X"]["a"];
    }
}
对我来说

,一个合乎逻辑的答案是在不同上下文共享的任何 JSON 事件中添加一个强制性的 EventType。

因此,事件类型应该是数据的强制性部分,而不是元数据。