DataSetZip.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*******************************************************************************
  2. * Copyright(c) 2012 dongke All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:DataSetZip.cs
  5. * 2.功能描述:本类将Dataset转化为DataSetSurrogate对象用Binary进行序列化
  6. * 然后进行压缩之后进行传输,最后进行解压缩
  7. * 编辑履历:
  8. * 作者 日期 版本 修改内容
  9. * 张国印 2014/8/29 1.00 新建
  10. *******************************************************************************/
  11. using System;
  12. using System.Data;
  13. using System.IO;
  14. using System.IO.Compression;
  15. using System.Runtime.Serialization.Formatters.Binary;
  16. namespace Dongke.IBOSS.PRD.Basics.Library
  17. {
  18. public class DataSetZip
  19. {
  20. //消息ID
  21. private const string MSG_ERR_INTERNAL = "MFWE00016";
  22. /// <summary>
  23. /// 取得将DataSet转化为DataSetSurrogate对象用Binary进行序列化,并压缩后的二进制数组
  24. /// </summary>
  25. /// <param name="dsData">需压缩的DataSet数据</param>
  26. /// <returns>压缩后二进制数组</returns>
  27. public static byte[] GetDataSetZipBytes(DataSet dsData)
  28. {
  29. try
  30. {
  31. DataSetSurrogate.DataSetSurrogate dss = new DataSetSurrogate.DataSetSurrogate(dsData);
  32. BinaryFormatter ser = new BinaryFormatter();
  33. MemoryStream ms = new MemoryStream();
  34. ser.Serialize(ms, dss);
  35. byte[] buffer = ms.ToArray();
  36. byte[] Zipbuffer = Compress(buffer);
  37. return Zipbuffer;
  38. }
  39. catch (Exception)
  40. {
  41. throw null;
  42. //throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "GetDataSetZipBytes" }, ex, null);
  43. }
  44. }
  45. /// <summary>
  46. /// 用.net自带的Gzip对二进制数组进行压缩,压缩比率可能不是太好
  47. /// </summary>
  48. /// <param name="data">二进制数组</param>
  49. /// <returns>压缩后二进制数组</returns>
  50. private static byte[] Compress(byte[] data)
  51. {
  52. MemoryStream ms = new MemoryStream();
  53. Stream zipStream = null;
  54. zipStream = new GZipStream(ms, CompressionMode.Compress, true);
  55. zipStream.Write(data, 0, data.Length);
  56. zipStream.Close();
  57. ms.Position = 0;
  58. byte[] compressed_data = new byte[ms.Length];
  59. ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
  60. return compressed_data;
  61. }
  62. /// <summary>
  63. /// 对二进制数组进行解压缩
  64. /// </summary>
  65. /// <param name="data">二进制数组</param>
  66. /// <returns>解压缩后的DataSet</returns>
  67. public static DataSet Decompress(byte[] data)
  68. {
  69. try
  70. {
  71. byte[] buffer = null;
  72. MemoryStream zipMs = new MemoryStream(data);
  73. buffer = EtractBytesFormStream(zipMs, data.Length);
  74. BinaryFormatter ser = new BinaryFormatter();
  75. DataSetSurrogate.DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate.DataSetSurrogate;
  76. DataSet dsData = dss.ConvertToDataSet();
  77. return dsData;
  78. }
  79. catch (Exception)
  80. {
  81. throw null;
  82. //throw new DataSetConverterException(MSG_ERR_INTERNAL, new string[] { "DataSetZip", "Decompress" }, ex, null);
  83. }
  84. }
  85. /// <summary>
  86. /// 用.net自带的Gzip对数据流进行解压缩
  87. /// </summary>
  88. /// <param name="zipMs">数据流</param>
  89. /// <param name="dataBlock">数据长度</param>
  90. /// <returns>解压缩后的二进制数组</returns>
  91. private static byte[] EtractBytesFormStream(MemoryStream zipMs, int dataBlock)
  92. {
  93. byte[] data = null;
  94. int totalBytesRead = 0;
  95. Stream zipStream = null;
  96. zipStream = new GZipStream(zipMs, CompressionMode.Decompress);
  97. while (true)
  98. {
  99. Array.Resize(ref data, totalBytesRead + dataBlock + 1);
  100. int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
  101. if (bytesRead == 0)
  102. {
  103. break;
  104. }
  105. totalBytesRead += bytesRead;
  106. }
  107. Array.Resize(ref data, totalBytesRead);
  108. return data;
  109. }
  110. }
  111. }