Azure Event Hub事件属性如何序列化?

时间:2019-06-21 17:51:33

标签: azure azure-eventhub

我想产生并发送EventData对象,这些对象在EventData.Properties词典中设置了各种应用程序特定的属性。 Properties字典本身定义为IDictionary<string, object>,这意味着我可以传递任何数据类型作为值。

var eventData = new EventData(bytes);
eventData.Properties["Prop1"] = // string?
eventData.Properties["Prop2"] = // int?
eventData.Properties["Prop3"] = // DateTime?
eventData.Properties["Prop4"] = // Custom?

我实际上 可以将哪些数据类型传递到Properties词典中?显然,该数据需要以某种方式进行序列化,但是文档中没有提及任何内容。

2 个答案:

答案 0 :(得分:0)

我尝试了一些不起作用的方法,然后通过查看异常调用堆栈找到了源代码,从而找到了更多信息。

就我而言,受支持的属性类型似乎是从AMQP协议支持的属性(记录在here中)派生的。内部AmqpMessageConverter代码中实际上有一个很大的switch语句,基本上可以为我提供答案:

AmqpMessageConverter.TryGetAmqpObjectFromNetObject

此处总结:

  • 所有.NET基本类型(intstringdouble等)
  • Guid
  • DateTimeDateTimeOffset
  • Stream
  • Uri
  • TimeSpan
  • byte[]
  • IList
  • IDictionary

我自己的自定义类型(POCO-“普通的旧CLR对象”)未被接受,并导致以下异常:

System.Runtime.Serialization.SerializationException: Serialization operation failed due to unsupported type EventHubsTesting.Program+Poco.
   at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.TryGetAmqpObjectFromNetObject(Object netObject, MappingType mappingType, Object& amqpObject)
   at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.UpdateAmqpMessageHeadersAndProperties(AmqpMessage message, String publisher, EventData eventData, Boolean copyUserProperties)
   at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.EventDataToAmqpMessage(EventData eventData)
   at Microsoft.Azure.EventHubs.Amqp.AmqpMessageConverter.EventDatasToAmqpMessage(IEnumerable`1 eventDatas, String partitionKey)
   at Microsoft.Azure.EventHubs.Amqp.AmqpEventDataSender.OnSendAsync(IEnumerable`1 eventDatas, String partitionKey)
   at Microsoft.Azure.EventHubs.EventDataSender.SendAsync(IEnumerable`1 eventDatas, String partitionKey)
   at Microsoft.Azure.EventHubs.EventHubClient.SendAsync(IEnumerable`1 eventDatas, String partitionKey)
   at EventHubsTesting.Program.Sender(CancellationTokenSource shutdownSource) in C:\EventHubsTesting\Program.cs:line 99

我假设如果要使用自定义类型,那么在将它们分配为应用程序属性之前,我需要先对其进行序列化。

答案 1 :(得分:0)

跟着克里斯的答案-AMQP标头根据AMQP类型规范-http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html进行序列化。

对于查看此答案的所有Java开发人员-您可以使用Apache qpid库执行编码/解码操作。可以在此处找到解码器类-https://qpid.apache.org/releases/qpid-proton-j-0.33.1/api/index.html

EH服务与编码无关,因此通过Kafka协议进行的消费者阅读将需要手动解码AMQP标头。本机EH客户端将为您解码标头。请参阅-https://github.com/Azure/azure-event-hubs-for-kafka/issues/56