public static int SerializeToBlock <T>(ref byte[] bytes, int offset, T obj, IFormatterResolver resolver) { var serializedData = MessagePackSerializer.SerializeUnsafe(obj, resolver); if (serializedData.Count < NotCompressionSize) { // can't write direct, shoganai... MessagePackBinary.EnsureCapacity(ref bytes, offset, serializedData.Count); Buffer.BlockCopy(serializedData.Array, serializedData.Offset, bytes, offset, serializedData.Count); return(serializedData.Count); } else { #if NET451 || NET40 var maxOutCount = LZ4Codec.MaximumOutputLength(serializedData.Count); #else var maxOutCount = LZ4Codec.MaximumOutputSize(serializedData.Count); #endif MessagePackBinary.EnsureCapacity(ref bytes, offset, c_lz4PackageHeaderSize + maxOutCount); // (ext header size + fixed length size) // acquire ext header position var extHeaderOffset = offset; offset += c_lz4PackageHeaderSize; // write body var lz4Length = LZ4Codec.Encode(serializedData.Array, serializedData.Offset, serializedData.Count, bytes, offset, bytes.Length - offset); // write extension header(always 6 bytes) extHeaderOffset += MessagePackBinary.WriteExtensionFormatHeaderForceExt32Block(ref bytes, extHeaderOffset, ExtensionTypeCode, lz4Length + 5); // write length(always 5 bytes) MessagePackBinary.WriteInt32ForceInt32Block(ref bytes, extHeaderOffset, serializedData.Count); return(c_lz4PackageHeaderSize + lz4Length); } }