错误:意外的流结束。数据可能已损坏

时间:2018-10-25 11:35:44

标签: c# stream memorystream lz4

我正在尝试使用流数据。我遇到错误了。我有一些类似下面的代码。两者都有效,但另一项无效。

此代码正常工作。

    private static void Main_2()
    {
        {
            var i = 1000000;

            var bf = new BinaryFormatter();
            var ms = new MemoryStream();
            bf.Serialize(ms, i);
            ms.Position = 0;
            Stream mem = File.Create("test.lz4");
            LZ4EncoderStream target = LZ4Stream.Encode(mem);
            ms.CopyTo(target);
            target.Dispose();
            ms.Dispose();
            mem.Dispose();
        }

        {
            Stream source = File.OpenRead("test.lz4");
            LZ4DecoderStream target = LZ4Stream.Decode(source);
            var mem = new MemoryStream();
            target.CopyTo(mem);

            var bf = new BinaryFormatter();
            mem.Position = 0;
            var i = (int)bf.Deserialize(mem);

            mem.Dispose();
            target.Dispose();
            source.Dispose();
        }
    }

此代码无效。

    private static void Main()
    {
        var m = new MemoryStream();

        {
            var i = 1000000;

            var bf = new BinaryFormatter();
            var ms = new MemoryStream();
            bf.Serialize(ms, i);
            ms.Position = 0;
            Stream mem = new MemoryStream();
            LZ4EncoderStream target = LZ4Stream.Encode(mem);
            ms.CopyTo(target);
            m = new MemoryStream(((MemoryStream)mem).ToArray());
            target.Dispose();
            ms.Dispose();
            mem.Dispose();
        }

        {
            Stream source = m;
            LZ4DecoderStream target = LZ4Stream.Decode(source);
            var mem = new MemoryStream();
            target.CopyTo(mem);

            var bf = new BinaryFormatter();
            mem.Position = 0;
            var i = (int)bf.Deserialize(mem);

            mem.Dispose();
            target.Dispose();
            source.Dispose();
        }
    }

这些代码之间有什么区别?我什么都找不到。为什么使用FileStream,为什么不使用MemoryStream?你能解释一下吗?

1 个答案:

答案 0 :(得分:1)

确保一切都被冲洗了。向下移动提取点:

//m = new MemoryStream(((MemoryStream)mem).ToArray());
target.Dispose();
ms.Dispose();
mem.Dispose();
m = new MemoryStream(((MemoryStream)mem).ToArray());