8,834
社区成员
发帖
与我相关
我的任务
分享
public class ZipHelp
{
public static void Zip(DataTable dt, out string afterZip)
{
IFormatter formatter = new BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
MemoryStream unCompressMS = new MemoryStream();//创建内存流对象
// 序列化DataTable
formatter.Serialize(unCompressMS, dt);
MemoryStream compressMs = new MemoryStream();
// gzip压缩
GZipStream gzipStream = new GZipStream(compressMs, CompressionMode.Compress, true);
gzipStream.Write(unCompressMS.ToArray(), 0, unCompressMS.ToArray().Length);
gzipStream.Close();
afterZip = Convert.ToBase64String(compressMs.ToArray(), 0, compressMs.ToArray().Length);
compressMs.Close();
unCompressMS.Close();
}
public static void UnZip(string ziped, out DataTable afterUnZip)
{
byte[] buffer1 = Convert.FromBase64String(ziped);
MemoryStream ms1 = new MemoryStream(buffer1, 0, buffer1.Length);
ms1.Position = 0;
MemoryStream ms2 = new MemoryStream();
byte[] buffer2 = new byte[4096];
int offset = 0;
// 解压
GZipStream gzipStream = new GZipStream(ms1, CompressionMode.Decompress);
while ((offset = gzipStream.Read(buffer2, 0, buffer2.Length)) != 0)
{
ms2.Write(buffer2, 0, offset);
}
gzipStream.Close();
BinaryFormatter formatter1 = new BinaryFormatter();
ms2.Position = 0;
// 反序列化
afterUnZip = formatter1.Deserialize(ms2) as DataTable;
ms2.Close();
ms1.Close();
}
}
class Program
{
static void Main(string[] args)
{
#region 测试DateTime.MinValue解压缩效率
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("time", typeof(DateTime));
for (int i = 0; i < 300; i++)
{
dt.Rows.Add(new object[] { "hahhahhaha", DateTime.MaxValue });
}
string afterzip = "";
DataTable afterUnZip = new DataTable();
DateTime time1 = DateTime.Now;
ZipHelp.Zip(dt, out afterzip);
DateTime time2 = DateTime.Now;
ZipHelp.UnZip(afterzip, out afterUnZip);
DateTime time3 = DateTime.Now;
TimeSpan ts1 = time2 - time1; //0.026秒
TimeSpan ts2 = time3 - time2; //0.091秒
DataTable dt1 = new DataTable();
dt1.Columns.Add("name", typeof(string));
dt1.Columns.Add("time", typeof(DateTime));
for (int i = 0; i < 300; i++)
{
dt1.Rows.Add(new object[] { "hahhahhaha", DateTime.MinValue });
}
string afterzip1 = "";
DataTable afterUnZip1 = new DataTable();
DateTime time4 = DateTime.Now;
ZipHelp.Zip(dt1, out afterzip1);
DateTime time5 = DateTime.Now;
ZipHelp.UnZip(afterzip1, out afterUnZip1);
DateTime time6 = DateTime.Now;
TimeSpan ts3 = time5 - time4; //0.01秒
TimeSpan ts4 = time6 - time5; //8.98秒
System.Console.WriteLine("");
#endregion
}
}
因为个系统的最小,最大时间不一致,我们一般使用自己自定义的最大最小时间,比如1900年1月1日,这样可以避免时间在存储传输时出现问题,当然在显示和处理时要做最大最小时间判断