为什么MemoryStream里读取的数组会全0

第一个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);

byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

compressedStream.Close();
ms.Close();
return buffer;
}
[/code]

第一个版本的问题是,buffer的长度不正确,同样的对象如果序列化到文件再读文件出来,长度总是和MemoryStream差那么十几个byte。甚是郁闷。

第二个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);
compressedStream.Flush();
compressedStream.Close();

byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

ms.Close();
return buffer;
}
[/code]

这样MemoryStream读取出来的byte组至少在长度上正确了。但是带来一个问题,读出来的byte数组里全是0,没读到数据。Read返回也是0。

第三个版本:

[code=’c#’]
public static byte[] Serialize(object o)
{
MemoryStream ms = new MemoryStream();
GZipStream compressedStream =
new GZipStream(ms, CompressionMode.Compress, true);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(compressedStream, o);
compressedStream.Flush();
compressedStream.Close();

ms.Position = 0;
byte[] buffer = new byte[ms.Length];
ms.Read(buffer, 0, (int)ms.Length);

ms.Close();
return buffer;
}
[/code]

这样终于正常了。这个事情告诉我们一下几个事实:

  • 凡是与Stream打交道时遇到的奇奇怪怪的问题多半与缓存有关,试试Flush()会有奇效。“自从缓存发明之后,计算机科学里就再也没有牛B的概念产生了。”
  • 使用MemoryStream时要打破思维定势,记得读取MemoryStream时要首先设置Position到合适的位置再读。
  • 没有做不到的事情。

发表评论