/******************************************************************************* * Copyright(c) 2012 dongke All rights reserved. / Confidential * 类的信息: * 1.程序名称:DataSetZip.cs * 2.功能描述:本类将Dataset转化为DataSetSurrogate对象用Binary进行序列化 * 然后进行压缩之后进行传输,最后进行解压缩 * 编辑履历: * 作者 日期 版本 修改内容 * 张国印 2014/8/29 1.00 新建 *******************************************************************************/ using System; using System.Data; using System.IO; using System.IO.Compression; using System.Runtime.Serialization.Formatters.Binary; namespace Dongke.IBOSS.PRD.Basics.Library { public class DataSetZip { //消息ID private const string MSG_ERR_INTERNAL = "MFWE00016"; /// /// 取得将DataSet转化为DataSetSurrogate对象用Binary进行序列化,并压缩后的二进制数组 /// /// 需压缩的DataSet数据 /// 压缩后二进制数组 public static byte[] GetDataSetZipBytes(DataSet dsData) { try { DataSetSurrogate.DataSetSurrogate dss = new DataSetSurrogate.DataSetSurrogate(dsData); BinaryFormatter ser = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); ser.Serialize(ms, dss); byte[] buffer = ms.ToArray(); byte[] Zipbuffer = Compress(buffer); return Zipbuffer; } catch (Exception) { throw null; //throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "GetDataSetZipBytes" }, ex, null); } } /// /// 用.net自带的Gzip对二进制数组进行压缩,压缩比率可能不是太好 /// /// 二进制数组 /// 压缩后二进制数组 private static byte[] Compress(byte[] data) { MemoryStream ms = new MemoryStream(); Stream zipStream = null; zipStream = new GZipStream(ms, CompressionMode.Compress, true); 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; } /// /// 对二进制数组进行解压缩 /// /// 二进制数组 /// 解压缩后的DataSet public static DataSet Decompress(byte[] data) { try { byte[] buffer = null; MemoryStream zipMs = new MemoryStream(data); buffer = EtractBytesFormStream(zipMs, data.Length); BinaryFormatter ser = new BinaryFormatter(); DataSetSurrogate.DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate.DataSetSurrogate; DataSet dsData = dss.ConvertToDataSet(); return dsData; } catch (Exception) { throw null; //throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "Decompress" }, ex, null); } } /// /// 用.net自带的Gzip对数据流进行解压缩 /// /// 数据流 /// 数据长度 /// 解压缩后的二进制数组 private static byte[] EtractBytesFormStream(MemoryStream zipMs, int dataBlock) { byte[] data = null; int totalBytesRead = 0; Stream zipStream = null; zipStream = new GZipStream(zipMs, CompressionMode.Decompress); 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; } } }