我试图通过TCP将对象作为字符串传输到另一台机器。我决定使用BinaryFormatter的组合,然后使用GZipStream,然后在发送之前使用Base64编码。在另一端,我做反向 - 解码字符串,GZipStream解压缩它,然后最终反序列化它。只有当我像这样实现它时它才起作用。获取'块长度与其补码不匹配。例外
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时,它可以正常工作。
答案 0 :(得分:2)
您需要先关闭GZipStream,然后将其分配给可变数据。
...
bf.Serialize(gzip, s);
gzip.Close();
data = Convert.ToBase64String(ms.GetBuffer());
答案 1 :(得分:0)
未清除压缩流。 在下面尝试并关闭流。
private static byte[] Compress(Stream input)
{
using(var compressStream = new MemoryStream())
using(var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
{
input.CopyTo(compressor);
compressor.Close();
return compressStream.ToArray();
}
}