c#对dataset和list集合压缩和解压,能提高访问速度
public class YS
{
public static byte[] Decompress(byte[] data)
{
byte[] bData;
MemoryStream ms = new MemoryStream();
//把数据写入到内存流
ms.Write(data, 0, data.Length);
//确定写入的位置,因为不是一次性写入
ms.Position = 0;
//解压流
GZipStream stream = new GZipStream(ms, CompressionMode.Decompress, true);
//性能处理
byte[] buffer = new byte[4096];
//临时内存流
MemoryStream temp = new MemoryStream();
//读入指定的文件流,0表示有没有到文件末尾
int read = stream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
//写入到临时缓冲区内
temp.Write(buffer, 0, read);
//
read = stream.Read(buffer, 0, buffer.Length);
}
//必须把stream流关闭才能返回ms流数据,不然数据会不完整
stream.Close();
stream.Dispose();
ms.Close();
ms.Dispose();
bData = temp.ToArray();
temp.Close();
temp.Dispose();
return bData;
}
/// <summary>
/// 压缩数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static byte[] Compress(byte[] data)
{
byte[] bData;
//创建内存流
MemoryStream ms = new MemoryStream();
//创建压缩解压对象
GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true);
//把数据写入缓冲区
stream.Write(data, 0, data.Length);
stream.Close();
stream.Dispose();
//必须把stream流关闭才能返回ms流数据,不然数据会不完整
//并且解压缩方法stream.Read(buffer, 0, buffer.Length)时会返回0
bData = ms.ToArray();
ms.Close();
ms.Dispose();
return bData;
} public static DataSet ConvertByteArrayToDataSet(Byte[] aByte)
{
DataSet resultDs = null;
MemoryStream ms = new MemoryStream(aByte);
IFormatter bf = new BinaryFormatter(); try
{ object obj = bf.Deserialize(ms);
resultDs = (DataSet)obj;
ms.Close();
return resultDs;
}
catch (Exception ex)
{
throw ex; }
finally
{
if (ms != null) ms.Close();
resultDs.Dispose(); } }
/// <summary>
/// 将DataSet格式化成字节数组byte[]
/// </summary>
/// <param name="dsOriginal">DataSet对象</param>
/// <returns>字节数组</returns>
public static Byte[] ConvertDataSetToByteArray(DataSet aDs)
{
//保存序列化的对象
Byte[] tranData; //创建内存流
MemoryStream ms = new MemoryStream();
//创建格式化对象
IFormatter bf = new BinaryFormatter(); try
{
if (aDs == null) return null;
//设置序列化的方式
aDs.RemotingFormat = SerializationFormat.Binary;
//序列化字节对象
bf.Serialize(ms, aDs);
//把流转换成字节数组
tranData = ms.ToArray();
ms.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (ms != null) ms.Close();
} return tranData;
} /// <summary>
/// 把list转换成dataset
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public static DataSet ConvertToDataSet<T>(IList<T> list)
{
if (list == null || list.Count <= 0)
{
return null;
} //创建dataset 对象
DataSet ds = new DataSet();
//创建表的,并且以类型的名字命名
DataTable dt = new DataTable(typeof(T).Name);
DataColumn column;
DataRow row;
//通过反射得到属性对象,只能得到简单的属性
System.Reflection.PropertyInfo[] myPropertyInfo
= typeof(T).GetProperties(System.Reflection.BindingFlags.Public
| System.Reflection.BindingFlags.Instance);
//遍历集合,遍历一次创建一行
foreach (T t in list)
{
if (t == null)
{
continue;
} row = dt.NewRow(); //根据属性创建列
for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
{
System.Reflection.PropertyInfo pi = myPropertyInfo[i]; string name = pi.Name;
if (name.Trim().ToLower().Equals("lastmodify"))
{
continue;
}
//判断列的值为不为空
if (dt.Columns[name] == null)
{
//获得属性的类型,作为列的类型
Type colType = pi.PropertyType;
//感觉这个if语句没啥用,有知道的朋友给我留言,谢谢了
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
column = new DataColumn(name, colType);
dt.Columns.Add(column);
}
//获得属性的值,判断是不是为空
row[name] = pi.GetValue(t, null) == null ? DBNull.Value
: pi.GetValue(t, null);
} dt.Rows.Add(row);
} ds.Tables.Add(dt); return ds;
} public static List<T> GetList<T>(DataSet ds )
{
DataTable table = ds.Tables[0];
List<T> list = new List<T>();
//
T t = default(T);
PropertyInfo[] propertypes = null;
string tempName = string.Empty;
try
{
foreach (DataRow row in table.Rows)
{
//动态创建一个对象
t = Activator.CreateInstance<T>();
//获得该类的所有属性
propertypes = t.GetType().GetProperties();
//遍历属性
foreach (PropertyInfo pro in propertypes)
{
//属性名
tempName = pro.Name;
//检查表中是否包含该列
if (table.Columns.Contains(tempName))
{
object value = row[tempName]; //值不能为空, if (value != null && value != DBNull.Value && row[tempName].ToString() != null &&
!row[tempName].ToString().Trim().Equals(""))
{
if (tempName.Trim().ToLower().Equals("lastmodify"))
{
// pro.SetValue(t, ConvertHelper.ConvertToTimestamp(Convert.ToString(value)), null);
}
else
{
//char类型单独处理
if (pro.PropertyType == typeof(System.Char)
|| pro.PropertyType == typeof(System.Nullable<System.Char>))
{
pro.SetValue(t, Convert.ToChar(value), null);
}
else
{
pro.SetValue(t, value, null);
} }
} //if (value.GetType() == typeof(System.DBNull))
//{
// value = null;
//}
//if (tempName.Trim().Equals("lastmodify"))
//{
// pro.SetValue(t,Convert.to //pro.SetValue(t, 0, null);
//}
//else
//{
// pro.SetValue(t, value, null);
//}
}
}
list.Add(t);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return list;
} }
static void Main(string[] args)
{ // using (BookShop2Entities context = new BookShop2Entities()) {
List<User<string>> list = new List<User<string>>{
new User<string>(){Age=90}
};
//把list集合转化成dataset
DataSet ds = YS.ConvertToDataSet(list); //压缩dataset
byte[] byes =YS.ConvertDataSetToByteArray(ds);
Console.WriteLine("压缩之前字节数"+byes.Length);
byte[] byesYS =YS.Compress(byes);
Console.WriteLine("压缩之后字节数" + byesYS.Length);
byte[] byesJZ = YS.Decompress(byesYS);
Console.WriteLine("解压之后字节数" + byesJZ.Length);
//解压成dataset
DataSet ds2 = YS.ConvertByteArrayToDataSet(byesJZ); //
Console.WriteLine("完成");
Console.Read(); }
这个自己写的,有什么问题可以给我留言
c#对dataset和list集合压缩和解压,能提高访问速度的更多相关文章
- ZipHelper 压缩和解压帮助类
ZipHelper 压缩和解压帮助类 关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 欢迎传播 ...
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...
- C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)
我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...
- java 文件压缩和解压(ZipInputStream, ZipOutputStream)
最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...
- C#实现通过Gzip来对数据进行压缩和解压
C#实现通过Gzip来对数据进行压缩和解压 internal static byte[] Compress(byte[] data) { using (var compressedStream = n ...
- linux常用命令:4文件压缩和解压命令
文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...
- .net文件压缩和解压及中文文件夹名称乱码问题
/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...
- linux下文件加密压缩和解压的方法
一.用tar命令 对文件加密压缩和解压 压缩:tar -zcf - filename |openssl des3 -salt -k password | dd of=filename.des3 此命 ...
- Linux下的压缩和解压
1. gzip, bzip2 能否直接压缩目录呢?不可以 2. 请快速写出,使用gzip和bzip2压缩和解压一个文件的命令.压缩:gzip 1.txt bzip2 1.txt解压:gzip -d 1 ...
随机推荐
- web 浏览器窗口window 与框架 frameset 的关系
如果页面包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中,可以通过数字索引(从0开始,从左右到右,从上到下)或者框架名称来访问相对应的window对象. 每个window ...
- 使用rsync 同步数据一些常用参数和示例
rsync rsync是linux系统下的数据镜像备份工具.支持远程同步,本地复制,或者与其他SSH.rsync主机同步. 包括本地推到远程,远程拉到本地两种同步方式,也可以实现本地不同路径下文件的同 ...
- Java 读取Excel 文件内容
在一个项目中,有一个需求,是把excel文件的内容转换为xml格式展示.在学习如何操作的过程中,首先是如何获取excel文件,其中操作的代码如下: 1.首先是导入需要的 jar, 下载地址:https ...
- 在 Android Studio 上调试数据库 ( SQLite ) (转)
转自:http://c.colabug.com/thread-1781696-1-1.html 以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我 ...
- StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...
- swiper轮播的slide高度自适应
方式1:官方给的属性 autoHeight: true, //高度随内容变化 发现实际没效果 方式2:先定义了一个slide的高度数组, //设置slide父级高度 index为slide的索引 fu ...
- nagios维护之常见问题
一.重启nagios 报错: Starting nagios:This account is currently not available. #这个账户目前不可用: 解决方法: a.编辑/e ...
- 十个前端UI优秀框架
最近需要一些前端框架,于是在网上整理了一些感觉不错的前端框架,有pc端和移动端,为了方便日后自己先记录下来了... Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( ...
- angular实现链接锚记
前言: 之所以这么说,是因为angular的路由将html默认的链接锚记的#给占用了,所以传统的链接锚记在这里将不再适用,这个有点坑啊,又要多写好几行代码来模拟这个功能. 实现原理: location ...
- vue 点击图片显示大图
使用指南:https://www.npmjs.com/package/vue-directive-image-previewer 简单使用: 1.安装vue-directive-image-previ ...