Ejemplo n.º 1
0
        public static async Task <SerializedObject> FromStreamAsync(Stream stream)
        {
            string            dataType           = null;
            string            serializerMimeType = null;
            MultiArray <byte> data = MultiArray <byte> .Empty;

#if COMPATIBILITY
            var intBuffer = new byte[4];

            await stream.ReadExactAsync(intBuffer, 0, 4).ConfigureAwait(false);

            var dataTypeByteLength = BitConverter.ToInt32(intBuffer, 0);
            if (dataTypeByteLength > -1)
            {
                var bytes = new byte[dataTypeByteLength];
                await stream.ReadExactAsync(bytes, 0, dataTypeByteLength).ConfigureAwait(false);

                dataType = Encoding.UTF8.GetString(bytes);
            }

            await stream.ReadExactAsync(intBuffer, 0, 4).ConfigureAwait(false);

            var serializerMimeTypeByteLength = BitConverter.ToInt32(intBuffer, 0);
            if (serializerMimeTypeByteLength > -1)
            {
                var bytes = new byte[serializerMimeTypeByteLength];
                await stream.ReadExactAsync(bytes, 0, serializerMimeTypeByteLength).ConfigureAwait(false);

                serializerMimeType = Encoding.UTF8.GetString(bytes);
            }

            await stream.ReadExactAsync(intBuffer, 0, 4).ConfigureAwait(false);

            var dataLength = BitConverter.ToInt32(intBuffer, 0);
            if (dataLength > -1)
            {
                const int segmentLength = 8192;
                var       rows          = dataLength / segmentLength;
                var       pos           = dataLength % segmentLength;
                if (pos > 0)
                {
                    rows++;
                }
                else
                {
                    pos = segmentLength;
                }

                var bytes = SegmentPool.RentContainer();
                for (var i = 0; i < rows; i++)
                {
                    var row = SegmentPool.Rent();
                    await stream.ReadExactAsync(row, 0, i == rows - 1?pos : segmentLength).ConfigureAwait(false);

                    bytes.Add(row);
                }
                data = new MultiArray <byte>(bytes, 0, dataLength);
            }
#else
            var intBuffer = new byte[4];

            stream.Fill(intBuffer);
            var dataTypeByteLength = BitConverter.ToInt32(intBuffer);
            if (dataTypeByteLength > -1)
            {
                var dBuffer = new byte[dataTypeByteLength];
                await stream.FillAsync(dBuffer).ConfigureAwait(false);

                dataType = Encoding.UTF8.GetString(dBuffer);
            }

            stream.Fill(intBuffer);
            var serializerMimeTypeByteLength = BitConverter.ToInt32(intBuffer);
            if (serializerMimeTypeByteLength > -1)
            {
                var dBuffer = new byte[serializerMimeTypeByteLength];
                await stream.FillAsync(dBuffer).ConfigureAwait(false);

                serializerMimeType = Encoding.UTF8.GetString(dBuffer);
            }

            stream.Fill(intBuffer);
            var dataLength = BitConverter.ToInt32(intBuffer);
            if (dataLength > -1)
            {
                var segmentLength = SegmentPool.SegmentLength;
                var rows          = Math.DivRem(dataLength, segmentLength, out var pos);
                if (pos > 0)
                {
                    rows++;
                }
                else
                {
                    pos = segmentLength;
                }

                var bytes = SegmentPool.RentContainer();
                for (var i = 0; i < rows; i++)
                {
                    var row = SegmentPool.Rent();
                    await stream.ReadExactAsync(row, 0, i == rows - 1?pos : segmentLength).ConfigureAwait(false);

                    bytes.Add(row);
                }
                data = new MultiArray <byte>(bytes, 0, dataLength);
            }
#endif

            return(new SerializedObject(data, dataType, serializerMimeType));
        }
Ejemplo n.º 2
0
        public static SerializedObject FromStream(Stream stream)
        {
            string            dataType           = null;
            string            serializerMimeType = null;
            MultiArray <byte> data = MultiArray <byte> .Empty;

#if COMPATIBILITY
            var intBuffer = new byte[4];

            stream.ReadExact(intBuffer, 0, 4);
            var dataTypeByteLength = BitConverter.ToInt32(intBuffer, 0);
            if (dataTypeByteLength > -1)
            {
                var bytes = new byte[dataTypeByteLength];
                stream.ReadExact(bytes, 0, dataTypeByteLength);
                dataType = Encoding.UTF8.GetString(bytes);
            }

            stream.ReadExact(intBuffer, 0, 4);
            var serializerMimeTypeByteLength = BitConverter.ToInt32(intBuffer, 0);
            if (serializerMimeTypeByteLength > -1)
            {
                var bytes = new byte[serializerMimeTypeByteLength];
                stream.ReadExact(bytes, 0, serializerMimeTypeByteLength);
                serializerMimeType = Encoding.UTF8.GetString(bytes);
            }

            stream.ReadExact(intBuffer, 0, 4);
            var dataLength = BitConverter.ToInt32(intBuffer, 0);
            if (dataLength > -1)
            {
                var segmentLength = SegmentPool.SegmentLength;
                var rows          = Math.DivRem(dataLength, segmentLength, out var pos);
                if (pos > 0)
                {
                    rows++;
                }
                else
                {
                    pos = segmentLength;
                }

                var bytes = SegmentPool.RentContainer();
                for (var i = 0; i < rows; i++)
                {
                    var row = SegmentPool.Rent();
                    stream.ReadExact(row, 0, i == rows - 1 ? pos : segmentLength);
                    bytes.Add(row);
                }

                data = new MultiArray <byte>(bytes, 0, dataLength);
            }
#else
            Span <byte> intBuffer = stackalloc byte[4];

            stream.Fill(intBuffer);
            var dataTypeByteLength = BitConverter.ToInt32(intBuffer);
            if (dataTypeByteLength > -1)
            {
                Span <byte> span = stackalloc byte[dataTypeByteLength];
                stream.Fill(span);
                dataType = Encoding.UTF8.GetString(span);
            }

            stream.Fill(intBuffer);
            var serializerMimeTypeByteLength = BitConverter.ToInt32(intBuffer);
            if (serializerMimeTypeByteLength > -1)
            {
                Span <byte> span = stackalloc byte[serializerMimeTypeByteLength];
                stream.Fill(span);
                serializerMimeType = Encoding.UTF8.GetString(span);
            }

            stream.Fill(intBuffer);
            var dataLength = BitConverter.ToInt32(intBuffer);
            if (dataLength > -1)
            {
                var segmentLength = SegmentPool.SegmentLength;
                var rows          = Math.DivRem(dataLength, segmentLength, out var pos);
                if (pos > 0)
                {
                    rows++;
                }
                else
                {
                    pos = segmentLength;
                }

                var bytes = SegmentPool.RentContainer();
                for (var i = 0; i < rows; i++)
                {
                    var row = SegmentPool.Rent();
                    stream.ReadExact(row, 0, i == rows - 1 ? pos : segmentLength);
                    bytes.Add(row);
                }

                data = new MultiArray <byte>(bytes, 0, dataLength);
            }
#endif

            return(new SerializedObject(data, dataType, serializerMimeType));
        }