开发者

GZipStream compression problem ( Lost Byte )

I've got some strange problem with GZip Serializer.

Trying serializing object with data in it.

Following code give results(开发者_运维问答at POINT1 in debug): ms.Length = 100028 and uncompressedStream.Length=100027

After POINT1 there is exception "End of Stream encountered before parsing was completed.", which i think is result of this lost byte.

I am using .net 4.0.

        //generating data
        int length = 100000;
        byte[] data = new byte[length];
        for (int i = 0; i < length; i++)
        {
            data[i] = System.Convert.ToByte(i % 100 + i % 50);
        }


        //serialization into memory stream
        IFormatter formatter = new BinaryFormatter();
        var ms = new MemoryStream();
        formatter.Serialize(ms, data);
        ms.Seek(0, SeekOrigin.Begin);

        //GZip zip
        MemoryStream compressedStream = new MemoryStream();
        var Compress = new GZipStream(compressedStream, CompressionMode.Compress);
        ms.CopyTo(Compress);  
        compressedStream.Seek(0, SeekOrigin.Begin);

        //GZip Unzip
        MemoryStream uncompressedStream = new MemoryStream();
        var Decompress = new GZipStream(compressedStream, CompressionMode.Decompress);
        Decompress.CopyTo(uncompressedStream);
        uncompressedStream.Seek(0, SeekOrigin.Begin);

        //deserialization from memory stream
        //POINT1
        var oo = formatter.Deserialize(uncompressedStream);
        var o = (byte[])oo;

        //checking
        Assert.AreEqual(data.Length, o.Length);
        for (int i = 0; i < data.Length; i++)
            Assert.AreEqual(data[i], o[i]);


Compression streams don't flush (and can't properly flush) until they are closed. You will need to close the GZipStream. Telling it not to close the underlying stream (one of the constructor arguments) will make this easier.

        //generating data
        int length = 100000;
        byte[] data = new byte[length];
        for (int i = 0; i < length; i++)
        {
            data[i] = System.Convert.ToByte(i % 100 + i % 50);
        }

        byte[] o;
        //serialization into memory stream
        IFormatter formatter = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            formatter.Serialize(ms, data);
            ms.Seek(0, SeekOrigin.Begin);

            //GZip zip
            using(MemoryStream compressedStream = new MemoryStream())
            {
                using (var Compress = new GZipStream(compressedStream, CompressionMode.Compress, true))
                {
                    ms.CopyTo(Compress);
                }
                compressedStream.Seek(0, SeekOrigin.Begin);
                //GZip Unzip
                using (MemoryStream uncompressedStream = new MemoryStream())
                {
                    using (var Decompress = new GZipStream(compressedStream, CompressionMode.Decompress, true))
                    {
                        Decompress.CopyTo(uncompressedStream);
                    }
                    uncompressedStream.Seek(0, SeekOrigin.Begin);
                    var oo = formatter.Deserialize(uncompressedStream);
                    o = (byte[])oo;
                }
            }
            //deserialization from memory stream
            //POINT1

        }
        //checking
        Debug.Assert(data.Length == o.Length);
        for (int i = 0; i < data.Length; i++)
            Debug.Assert(data[i] == o[i]);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜