public byte[] getDataSetSer()
{
DataSet ds = getDataSet();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, ds);
ms.Close();
return ms.ToArray();
}
代码如上,我的问题是ms.Close() 流已经关闭了 为什么用return ms.ToArray()返回还能得到正确的结果。
不太理解。第二个问题:
byte[] data;
(1) MemoryStream ms1 = new MemoryStream(data);
(2) MemoryStream ms2 = new MemoryStream();
ms2.Write(data, 0, data.Length);
(1)和(2)的代码是等效的吗。
因为每次解压缩时都要用到此段代码,如
private byte[] myDeCompress(byte[] data)
{
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length);
input.Position = 0;
GZipStream gstream = new GZipStream(input, CompressionMode.Decompress, true);
........
}
本人对流这方面实在有些迷糊 请高手指点! 谢谢!
{
DataSet ds = getDataSet();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, ds);
ms.Close();
return ms.ToArray();
}
代码如上,我的问题是ms.Close() 流已经关闭了 为什么用return ms.ToArray()返回还能得到正确的结果。
不太理解。第二个问题:
byte[] data;
(1) MemoryStream ms1 = new MemoryStream(data);
(2) MemoryStream ms2 = new MemoryStream();
ms2.Write(data, 0, data.Length);
(1)和(2)的代码是等效的吗。
因为每次解压缩时都要用到此段代码,如
private byte[] myDeCompress(byte[] data)
{
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length);
input.Position = 0;
GZipStream gstream = new GZipStream(input, CompressionMode.Decompress, true);
........
}
本人对流这方面实在有些迷糊 请高手指点! 谢谢!
下面是MemoryStream的几个方法的源代码:
public virtual byte[] ToArray()
{
byte[] dst = new byte[this._length - this._origin];
Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0, this._length - this._origin);
return dst;
}
protected override void Dispose(bool disposing)
{
try
{
if (disposing)
{
this._isOpen = false;
this._writable = false;
this._expandable = false;
}
}
finally
{
base.Dispose(disposing);
}
}MemoryStream 没有定义自己的Close方法,而Base的Close就是调用Dispose(true)
你可以看到Close 并没有去清掉_buffer,所以ToArray的时候能返回数组第二个问题:
应该是等效的,只是用第二种方式要多几行代码了,Write后要把Postion归0
{
if (buffer == null)
{
throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer"));
}
this._buffer = buffer;
this._length = this._capacity = buffer.Length;
this._writable = writable;
this._exposable = false;
this._origin = 0;
this._isOpen = true;
}
public override void Write(byte[] buffer, int offset, int count)
{
if (!this._isOpen)
{
__Error.StreamIsClosed();
}
if (!this._writable)
{
__Error.WriteNotSupported();
}
if (buffer == null)
{
throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer"));
}
if (offset < 0)
{
throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
}
if (count < 0)
{
throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
}
if ((buffer.Length - offset) < count)
{
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));
}
int num = this._position + count;
if (num < 0)
{
throw new IOException(Environment.GetResourceString("IO.IO_StreamTooLong"));
}
if (num > this._length)
{
bool flag = this._position > this._length;
if ((num > this._capacity) && this.EnsureCapacity(num))
{
flag = false;
}
if (flag)
{
Array.Clear(this._buffer, this._length, num - this._length);
}
this._length = num;
}
if (count <= 8)
{
int num2 = count;
while (--num2 >= 0)
{
this._buffer[this._position + num2] = buffer[offset + num2];
}
}
else
{
Buffer.InternalBlockCopy(buffer, offset, this._buffer, this._position, count);
}
this._position = num;
}
Write只是在原来的基础上继续向_buffer添加byte【】,而实例化传入byte【】,就是初始化_buffer而已
2.效果是一样的。
第一个问题 二楼正解
第二个问题 两者不一样...Position属性不同 ^_^ 用ReadObject的时候 如果用byte[]初始化可以直接用 Write之后必须把Postion置0
2一样的效果 但感觉MemoryStream ms1 = new MemoryStream(data); 好看些