【问题标题】:Error: Unexpected end of stream. Data might be corrupted错误:流意外结束。数据可能已损坏
【发布时间】:2018-10-25 11:35:43
【问题描述】:

我正在尝试使用流数据。我收到一个错误。我有一些如下代码。两者之一有效,但另一个无效。

这段代码可以正常工作。

    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?你能解释一下吗?

【问题讨论】:

    标签: c# stream memorystream lz4


    【解决方案1】:

    确保所有内容都已刷新。下移提取点:

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

    【讨论】:

    • 谢谢。有用。但实际上我认为除非处理它,否则我无法获取流数据。为什么要在创建新的内存流数据之前刷新它?
    • “流的意外结束”通常意味着流没有正确关闭/刷新。这里我认为是target。在这种情况下,将它们全部关闭是安全的。
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多