Как сериализуются свойства событий Azure Event Hub? - PullRequest
0 голосов
/ 21 июня 2019

Я хочу создать и отправить 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 голосов
/ 17 июля 2019

В ответ на ответ Криса - заголовки 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.

0 голосов
/ 21 июня 2019

Я нашел больше информации, попробовав что-то, что не сработало, а затем нашел исходный код, посмотрев на стек вызовов исключений.

В моем случае поддерживаемые типы свойств, похоже, получены изчто поддерживает протокол AMQP (что задокументировано здесь ).На самом деле во внутреннем AmqpMessageConverter коде есть большой оператор switch, который дает мне мой ответ:

AmqpMessageConverter.TryGetAmqpObjectFromNetObject

Подводя итог:

  • Все типы примитивов .NET (int, string, double и т. Д.)
  • Guid
  • DateTime и DateTimeOffset
  • 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

Я предполагаю, чтоесли я хочу использовать пользовательские типы, то мне нужно будет их сериализовать самостоятельно, прежде чем назначать их в качестве свойств приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...