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)); }
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)); }