private bool TryComputeCloudEventContentLength(CloudEventContent content, out long length)
        {
            MethodInfo methodInfo = typeof(CloudEventContent).GetMethod(nameof(TryComputeLength), BindingFlags.Instance | BindingFlags.NonPublic);

            length = 0;
            if (methodInfo is null)
            {
                return(false);
            }

            var parameters = new object[] { length };
            var result     = (bool)methodInfo.Invoke(content, parameters);

            length = (long)parameters[0];
            return(result);
        }
        /// <summary>Serialize the HTTP content to a stream as an asynchronous operation.</summary>
        /// <param name="stream">The target stream.</param>
        /// <param name="context">Information about the transport (channel binding token, for example). This parameter may be null.</param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
        {
            Guard.NotNull(stream, nameof(stream));

            await EncodeStringToStreamAsync(stream, "[", cancellationToken : default);

            for (int i = 0, l = _contents.Count(); i < l; i++)
            {
                CloudEventContent content = _contents.ElementAt(i);
                await content.CopyToAsync(stream, context);

                bool isNotLastElement = i + 1 < l;
                if (isNotLastElement)
                {
                    await EncodeStringToStreamAsync(stream, ",", cancellationToken : default);
                }
            }

            await EncodeStringToStreamAsync(stream, "]", cancellationToken : default);

            Headers.ContentType = MediaTypeHeaderValue.Parse(CloudEventBatchContentType);
        }