关于DateTime里的MinValue解决办法
关于DateTime里的MinValue
最近做重构,主要解决系统有个页面数据加载慢的问题,页面调用WebService返回一个DataTable,表中字段基本囊括了所有常用类型,返回数据大概400行。开始以为是WebService传输数据多的原因,对传输数据进行了优化,分批次传回部分数据,测试下来还是慢;然后想到将DataTable压缩传输,解决了传输慢的问题,可是发现解压缩的过程成了一个瓶颈。甚至这个过程比直接传输DataTable还慢。于是拆开每个列做成DataTable解压和传输,发现了问题所在:DataTable中有大量的DateTime类型的数据,且其值为0000-00-00,也就是DateTime.MinValue,当换成其他时间时就挺快的了。上网查了下原因,说是SOAP序列化和传输时处理0000-00-00会有异常,具体不太明白,而且我用的序列化方法是二进制序列化,应该与SOAP无关,请大神给解释下。
代码参考liyiding23,贴如下:
测试代码:
最近做重构,主要解决系统有个页面数据加载慢的问题,页面调用WebService返回一个DataTable,表中字段基本囊括了所有常用类型,返回数据大概400行。开始以为是WebService传输数据多的原因,对传输数据进行了优化,分批次传回部分数据,测试下来还是慢;然后想到将DataTable压缩传输,解决了传输慢的问题,可是发现解压缩的过程成了一个瓶颈。甚至这个过程比直接传输DataTable还慢。于是拆开每个列做成DataTable解压和传输,发现了问题所在:DataTable中有大量的DateTime类型的数据,且其值为0000-00-00,也就是DateTime.MinValue,当换成其他时间时就挺快的了。上网查了下原因,说是SOAP序列化和传输时处理0000-00-00会有异常,具体不太明白,而且我用的序列化方法是二进制序列化,应该与SOAP无关,请大神给解释下。
代码参考liyiding23,贴如下:
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 });