在 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# 的情况下,什么是好的解决方案?
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。
因此,事件类型应该是数据的强制性部分,而不是元数据。