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集合压缩和解压,能提高访问速度的更多相关文章

  1. ZipHelper 压缩和解压帮助类

    ZipHelper 压缩和解压帮助类 关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 欢迎传播 ...

  2. 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货

    关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...

  3. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  4. java 文件压缩和解压(ZipInputStream, ZipOutputStream)

    最近在看java se 的IO 部分 , 看到 java 的文件的压缩和解压比较有意思,主要用到了两个IO流-ZipInputStream, ZipOutputStream,不仅可以对文件进行压缩,还 ...

  5. C#实现通过Gzip来对数据进行压缩和解压

    C#实现通过Gzip来对数据进行压缩和解压 internal static byte[] Compress(byte[] data) { using (var compressedStream = n ...

  6. linux常用命令:4文件压缩和解压命令

    文件压缩和解压命令 压缩命令:gzip.tar[-czf].zip.bzip2 解压缩命令:gunzip.tar[-xzf].unzip.bunzip2 1. 命令名称:gzip 命令英文原意:GNU ...

  7. .net文件压缩和解压及中文文件夹名称乱码问题

    /**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...

  8. linux下文件加密压缩和解压的方法

    一.用tar命令 对文件加密压缩和解压 压缩:tar -zcf  - filename |openssl des3 -salt -k password | dd of=filename.des3 此命 ...

  9. Linux下的压缩和解压

    1. gzip, bzip2 能否直接压缩目录呢?不可以 2. 请快速写出,使用gzip和bzip2压缩和解压一个文件的命令.压缩:gzip 1.txt bzip2 1.txt解压:gzip -d 1 ...

随机推荐

  1. create-react-app之proxy

    [create-react-app之proxy] create-react-app可以用于一键创建web_client环境,默认使用webpack-dev-server.但在开发过程中,往往需要cli ...

  2. EF CodeFirst学习笔记001--主键约定

    Code First 的核心是约定,这些默认的规则使我们可以用我们自己的类来创建模型.EF框架要求一个类必须有一个键属性.规则约定如果一个属性名为Id或者是类名+Id的形式(如PatientId),这 ...

  3. display:none和visibility:hidden

    display:none和visibility:hidden的区别在哪儿? “这个问题简单?”我心里头暗自得意,按耐住自己得意又紧张的小心脏,自信满满地说,“这两个声明都可以让元素隐藏,不同之处在于d ...

  4. 织梦栏目判断 seotitle的小bug

    有的栏目有seotitle(中文字符),有的没有,页面显示需要把seotitle放在括号中,所以进行了以下代码: {dede:field name="seotitle" runph ...

  5. 第二章 向量(d4)有序向量:二分查找(改进)

  6. Centos 7 MariaDB Galera cluster 部署

    一.安装环境准备 1.系统: CentOS Linux release 7.4.1708 (Core) 2.hosts 10.6.32.51 openstack1 10.6.32.52 opensta ...

  7. jsp页面之初体验

    最近在学jsp 在web.xml页面中学到了如何让一个页面第一个启动

  8. Shell教程 之数组

    1.定义数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. Shell ...

  9. JAVA去重

    JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 ...

  10. Java 的静态工厂方法

    本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...