// this method shows an example of how EventData.Body can be deserialized into multiple records.
 protected override IEnumerable <EventHubRecord> DeserializeEventData(EventDataFromCapture eventData)
 {
     // assumes EventData.Body is a gzipped line separated records.
     using (var stream = new MemoryStream(eventData.Body))
     {
         try
         {
             // deserialize body from a single eventdata completely. Skip eventData message body with invalid format.
             using (var unzippedStream = new GZipStream(stream, CompressionMode.Decompress))
             {
                 return(this.contentDeserializer
                        .Deserialize(unzippedStream)
                        .Select(
                            payload => new EventHubRecord()
                 {
                     Offset = eventData.Offset,
                     Payload = payload
                 })
                        .ToArray());
             }
         }
         catch (Exception e)
         {
             var shortErrorMessage = $"Error deserializing eventhub message with offset: {eventData.Offset} SequenceNumber:{eventData.SequenceNumber}";
             this.diagnostics.WriteError(
                 shortErrorMessage,
                 $"{shortErrorMessage} Exception: {e}");
             return(Enumerable.Empty <EventHubRecord>());
         }
     }
 }
        public override IEnumerable <T> Deserialize(Stream stream)
        {
            IFileReader <GenericRecord> reader = null;

            try
            {
                reader = DataFileReader <GenericRecord> .OpenReader(stream);
            }
            catch (Exception e)
            {
                this.diagnostics.WriteError(
                    briefMessage: "Unable to open stream as avro. Please check if the stream is from eventhub capture. https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-capture-overview ",
                    detailedMessage: e.Message);
                throw;
            }

            foreach (GenericRecord genericRecord in reader.NextEntries)
            {
                EventDataFromCapture eventData = this.ConvertToEventDataFromCapture(genericRecord);

                // deserialize records from eventdata body.
                foreach (T record in this.DeserializeEventData(eventData))
                {
                    yield return(record);
                }
            }

            reader.Dispose();
        }
        private EventDataFromCapture ConvertToEventDataFromCapture(GenericRecord genericRecord)
        {
            try
            {
                var eventData = new EventDataFromCapture()
                {
                    EnqueuedTimeUtc = (string)genericRecord["EnqueuedTimeUtc"],
                    Offset          = (string)genericRecord["Offset"],
                    SequenceNumber  = (long)genericRecord["SequenceNumber"],
                    Body            = (byte[])genericRecord["Body"],
                };

                return(eventData);
            }
            catch (Exception e)
            {
                this.diagnostics.WriteError(
                    briefMessage: $"Unable to get fields required to create captured event data. Error: {e.Message}",
                    detailedMessage: e.ToString());
                throw;
            }
        }
 protected abstract IEnumerable <T> DeserializeEventData(EventDataFromCapture eventData);