public static byte[] Decode(Stream stream, bool readStrict = false)
 {
     if (!readStrict)
     {
         var buffer = Jetsons.MsgPack.Internal.InternalMemoryPool.GetBuffer(); // use MessagePackSerializer.Pool!
         var len    = FillFromStream(stream, ref buffer);
         return(Decode(new ArraySegment <byte>(buffer, 0, len)));
     }
     else
     {
         int blockSize;
         var bytes = MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, false, out blockSize);
         return(Decode(new ArraySegment <byte>(bytes, 0, blockSize)));
     }
 }
 public static T Deserialize <T>(Stream stream, IFormatterResolver resolver, bool readStrict)
 {
     if (!readStrict)
     {
         var buffer = Jetsons.MsgPack.Internal.InternalMemoryPool.GetBuffer(); // use MessagePackSerializer.Pool!
         var len    = FillFromStream(stream, ref buffer);
         return(DeserializeCore <T>(new ArraySegment <byte>(buffer, 0, len), resolver));
     }
     else
     {
         int blockSize;
         var bytes = MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, false, out blockSize);
         return(DeserializeCore <T>(new ArraySegment <byte>(bytes, 0, blockSize), resolver));
     }
 }
        public static T Deserialize <T>(Stream stream, IFormatterResolver resolver, bool readStrict)
        {
            if (resolver == null)
            {
                resolver = DefaultResolver;
            }
            var formatter = resolver.GetFormatterWithVerify <T>();

            if (!readStrict)
            {
#if NETSTANDARD && !NET45
                var ms = stream as MemoryStream;
                if (ms != null)
                {
                    // optimize for MemoryStream
                    ArraySegment <byte> buffer;
                    if (ms.TryGetBuffer(out buffer))
                    {
                        int readSize;
                        return(formatter.Deserialize(buffer.Array, buffer.Offset, resolver, out readSize));
                    }
                }
#endif

                // no else.
                {
                    var buffer = InternalMemoryPool.GetBuffer();

                    FillFromStream(stream, ref buffer);

                    int readSize;
                    return(formatter.Deserialize(buffer, 0, resolver, out readSize));
                }
            }
            else
            {
                int _;
                var bytes = MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, false, out _);
                int readSize;
                return(formatter.Deserialize(bytes, 0, resolver, out readSize));
            }
        }
        static T DeserializeWithLengthPrefixExt2 <T>(Stream stream, IFormatterResolver resolver)
        {
            const int ExtTypeCode = 111; // sample ext code

            using (var output = new ArrayBufferWriter(16))
            {
                MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, output);

                var reader = new MessagePackReader(output.WrittenSpan);
                var header = reader.ReadExtensionFormat();
                if (header.TypeCode == ExtTypeCode)
                {
                    return(MessagePackSerializer.Deserialize <T>(header.Data, resolver));
                }
                else
                {
                    throw new Exception();
                }
            }
        }
        static T DeserializeWithLengthPrefixExt <T>(Stream stream, IFormatterResolver resolver)
        {
            const int ExtTypeCode = 111; // sample ext code

            using (var output = new ArrayBufferWriter(16))
            {
                MessagePackBinary.ReadMessageBlockFromStreamUnsafe(stream, output);

                var reader = new MessagePackReader(output.WrittenSpan);
                var header = reader.ReadExtensionFormatHeader();
                if (header.TypeCode == ExtTypeCode)
                {
                    // memo, read fully
                    var valueSpan = reader.Peek((int)header.Length);
                    var reader0   = new MessagePackReader(valueSpan);
                    return(resolver.GetFormatter <T>().Deserialize(ref reader0, resolver));
                }
                else
                {
                    throw new Exception();
                }
            }
        }