我试图通过 TCP 将对象作为字符串传输到另一台机器。我决定在发送之前使用 BinaryFormatter 的组合,然后是 GZipStream 和 Base64 编码。在另一端,我做相反的事情 - 解码字符串,GZipStream 解压缩它,然后最后反序列化它。只有当我像这样实现它时它才不起作用。获取“块长度与其补码不匹配”。异常(exception)

        string s = new String('@', 10000);
        string s2 = "";

        string data;

        using (var ms = new MemoryStream())
        {
            using (var gzip = new GZipStream(ms, CompressionMode.Compress))
            {
                var bf = new BinaryFormatter();
                bf.Serialize(gzip, s);

                gzip.Flush();
                ms.Flush();

                data = Convert.ToBase64String(ms.GetBuffer());
            }
        }

        using (var ms = new MemoryStream(Convert.FromBase64String(data)))
        {
            using (var gzip = new GZipStream(ms, CompressionMode.Decompress, true))
            {
                var binaryFormatter = new BinaryFormatter();
                s2 = binaryFormatter.Deserialize(gzip) as string;
            }
        }

        if (s != s2)
        {
            Console.WriteLine("Doesnt match");
        }

结果是
未处理的异常:System.IO.InvalidDataException:块长度与其补码不匹配。

任何想法?最让我困惑的是,当我在本地摆脱 Base64 编码时,它工作正常。

最佳答案

您需要先关闭 GZipStream,然后才能将其分配给变量数据。

...
bf.Serialize(gzip, s);

gzip.Close();

data = Convert.ToBase64String(ms.GetBuffer());

关于c# - GZipStream - 块长度与其补码不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41168774/

10-13 04:58