gzipstream超过tcp没有解压缩

时间:2012-07-01 18:49:12

标签: c# stream compression gzipstream

我正在尝试使用protobuf-net和\ t通过tcp连接发送序列化的压缩数据 GzipStream

从zipstream反序列化或读取只是阻塞而无法完成。

为了测试它,我选择尝试使用更简单的FileStream来查看数据实际上是在压缩和编写的,就是这样。 但是,Console.writeLine(inPerson1.name)行会抛出Object reference not set exception,因为它似乎没有从zipstream中读取任何数据。

关于为什么或我做错了什么的想法?

代码:

public void TestZipToFile(){
  var person1 = new Person { id = 1, name = "Pete" };
  var person2 = new Person { id = 2, name = "Sarah" };
  using (var file = File.Create("people.bin"))
  {
    GZipStream zs = new GZipStream(file, CompressionMode.Compress);
    Serializer.SerializeWithLengthPrefix<Person>(zs, person1, PrefixStyle.Fixed32);//.Serialize(file, foo);
    Serializer.SerializeWithLengthPrefix<Person>(zs, person2, PrefixStyle.Fixed32);//.Serialize(file, foo);
  }
  Person inPerson1 = null;
  Person inPerson2 = null;
  using (var file = File.OpenRead("people.bin"))
  {
    GZipStream ozs = new GZipStream(file, CompressionMode.Decompress);
    inPerson1 = Serializer.DeserializeWithLengthPrefix<Person>(ozs,PrefixStyle.Fixed32);//.Deserialize<Foo>(file);
    inPerson2 = Serializer.DeserializeWithLengthPrefix<Person>(ozs, PrefixStyle.Fixed32);//.Deserialize<Foo>(file);
  }
  Console.WriteLine(inPerson1.name);
  Console.WriteLine(inPerson2.name);
}

[ProtoContract]
public class Person
{
  [ProtoMember(1)
  public int id;
  [ProtoMember(2)]
  public string name;
}

1 个答案:

答案 0 :(得分:2)

您永远不会关闭输出GZipStream,因此我怀疑它最终永远不会向底层流写入任何内容。对于每个using以及GZipStream,您应该有一个FileStream声明。