Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Deflatestream—解析完成之前到达的流的结尾_C#_Filestream_Compression_Deflatestream - Fatal编程技术网

C# Deflatestream—解析完成之前到达的流的结尾

C# Deflatestream—解析完成之前到达的流的结尾,c#,filestream,compression,deflatestream,C#,Filestream,Compression,Deflatestream,我尝试将列表写入文件流。由于对象太大,我将列表分成均匀分布的块,并使用DeflateStream将其附加到文件流中以压缩数据。这一切都很好 但是,如果我尝试执行同样的操作来解压缩它,它会给出一个错误:“在解析完成之前到达流的末尾”。这是要解压缩的代码: using (FileStream fs = new FileStream(filePath, FileMode.Open)) { using (DeflateStream ds = new DeflateStream(fs, Compr

我尝试将列表写入文件流。由于对象太大,我将列表分成均匀分布的块,并使用DeflateStream将其附加到文件流中以压缩数据。这一切都很好

但是,如果我尝试执行同样的操作来解压缩它,它会给出一个错误:“在解析完成之前到达流的末尾”。这是要解压缩的代码:

using (FileStream fs = new FileStream(filePath, FileMode.Open)) {
    using (DeflateStream ds = new DeflateStream(fs, CompressionMode.Decompress, true)) {
        //Deserialize offerte
        BinaryFormatter bf = new BinaryFormatter();
        //Check position
        while (ds.BaseStream.Position < ds.BaseStream.Length) {
            result.AddRange((List<User>)bf.Deserialize(ds));
        }
    }
}

显然,你没有正确地压缩。序列化时是否关闭/处理
DeflateStream
。我为列表的每一部分调用此代码。哦,现在我知道问题可能出在哪里了。在序列化代码中,使用(DeflateStream…part将块迭代逻辑移动到
中是的,现在您说这是有意义的。文件的长度可能写在头中,当您使用第一个块创建文件时。它已经有固定的长度了吗?或者我是在说一些绝对疯狂的事情吗?序列化之后,您的数据是这样的:
DEFLATE\u HEADER data DEFLATE\u HEADER data
…,但您尝试将其反序列化,就像它是
DEFLATE\u HEADER data data…
,这会关闭
二进制格式化程序
using (FileStream fs = new FileStream(filePath, FileMode.Append)) {
    using (DeflateStream cs = new DeflateStream(fs, CompressionMode.Compress)) {
        //Serialize offerte
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(cs, offerte);
    }
}