C# 中对DataSet进行压缩
下面的方法中用到了DataSetSurrogate (附录中带了源码)
1、调用 DataSetSurrogate对数据集进行序列化操作,生成二进制数组
public byte[] getSerializeDataSet(DataSet dt)
{
DataSetSurrogate dss = new DataSetSurrogate(dt);
BinaryFormatter ser = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ser.Serialize(ms, dss);
byte[] buffer = ms.ToArray();
return buffer;
}
2、 对二进制数组进行压缩,得到压缩后的二进制数组
public byte[] Compress(byte[] data)//压缩
{
MemoryStream ms = new MemoryStream();
Stream zipStream = null;
zipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true);
//System.IO.Compression.CompressionMode:指定是否压缩和解压缩基础流(Compress:压缩,DeCompress:解压缩)
zipStream.Write(data, 0, data.Length);
zipStream.Close();
ms.Position = 0;//获取或设置流中当前位置
byte[] compressed_data = new byte[ms.Length];
ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
return compressed_data;
}
3、压缩后的DATASET就生成了
4、下面为如何解压缩得到DATASET
public byte[] Decompress(byte[] data)//解压缩
{
try
{
MemoryStream ms = new MemoryStream(data);
Stream zipStream = null;
zipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress);
byte[] dc_data = null;
dc_data = EtractBytesFormStream(zipStream, data.Length);
return dc_data;
}
catch
{
return null;
}
}
public byte[] EtractBytesFormStream(Stream zipStream, int dataBlock)
{
try
{
byte[] data = null;
int totalBytesRead = 0;
while (true)
{
Array.Resize(ref data, totalBytesRead + dataBlock + 1);
int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
if (bytesRead == 0)
{
break;
}
totalBytesRead += bytesRead;
}
Array.Resize(ref data, totalBytesRead);
return data;
}
catch
{
return null;
}
}
5、通过DataSetSurrogate得到解压后的DATASET
public DataSet ReSerializable(byte[] buffer)
{
BinaryFormatter ser = new BinaryFormatter();
DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
DataSet dataSet = dss.ConvertToDataSet();
return dataSet;
}