/// <summary>
        /// Saves writer content to the given byte[] and it's offset.
        /// </summary>
        /// <param name="data">The byte[].</param>
        /// <param name="offset">The offset.</param>
        /// <returns></returns>
        public int ToArray(byte[] data, int offset)
        {
            long size = 0;

            ManagedBinaryMemoryWriterSegment segment = this.segment;

            while (segment != null)
            {
                size += segment.Length;

                segment = segment.Next;
            }

            if (data.Length < size + offset)
            {
                throw new ArgumentException("Not enough memory in data.", "data");
            }

            int position = offset;

            segment = this.segment;

            while (segment != null)
            {
                segment.ToArray(data, ref position);

                segment = segment.Next;
            }

            return((int)size);
        }
        /// <summary>
        /// Generates a new array with the contents of this writer. Beware, the content shouldn't exceed .NET memory array limit of nearly 2 GiB.
        /// </summary>
        /// <returns>The array.</returns>
        public byte[] ToArray()
        {
            long size = 0;

            ManagedBinaryMemoryWriterSegment segment = this.segment;

            while (segment != null)
            {
                size += segment.Length;

                segment = segment.Next;
            }

            if (size > 2147000000)
            {
                throw new OutOfMemoryException("Array buffers can't exceed 2147000000 bytes. Write to a stream, if you generated bigger data than the near 2 GiB limit.");
            }

            byte[] data = new byte[size];

            int position = 0;

            segment = this.segment;

            while (segment != null)
            {
                segment.ToArray(data, ref position);

                segment = segment.Next;
            }

            return(data);
        }