zoukankan      html  css  js  c++  java
  • DataTable序列化

    DataTable是复杂对象,无法直接序列化,必须通过其他的方式来实现

    下面介绍一下常用的几种方式

    1、先转换为List,再序列化List

    下面是DataTable转换为List的方法

     1         protected  List<T> ConvertToList<T>(DataTable dt) where T : new()
     2         {
     3             // 定义集合    
     4             List<T> ts = new List<T>();
     5 
     6             // 获得此模型的类型   
     7             Type type = typeof(T);
     8             string tempName = "";
     9 
    10             foreach (DataRow dr in dt.Rows)
    11             {
    12                 T t = new T();
    13                 // 获得此模型的公共属性      
    14                 PropertyInfo[] propertys = t.GetType().GetProperties();
    15                 foreach (PropertyInfo pi in propertys)
    16                 {
    17                     tempName = pi.Name;  // 检查DataTable是否包含此列    
    18 
    19                     if (dt.Columns.Contains(tempName))
    20                     {
    21                         // 判断此属性是否有Setter      
    22                         if (!pi.CanWrite) continue;
    23 
    24                         object value = dr[tempName];
    25                         if (value != DBNull.Value)
    26                             pi.SetValue(t, value, null);
    27                     }
    28                 }
    29                 ts.Add(t);
    30             }
    31             return ts;
    32         } 

    然后使用JavaScriptSerializer类实现序列化

    1    List<User> lstUer = ConvertToList<User>(dtUser);
    2    JavaScriptSerializer jss = new JavaScriptSerializer();
    3    string json = jss.Serialize(lstUer);

    转换为List在序列化有一个缺点,就是必须建立DataTable对应的实体类

    2、使用Newtonsoft.Json实现

    string json = JsonConvert.SerializeObject(table); 

    这种方法必须引入第三方类库Newtonsoft.Json.dll

    3、直接遍历拼接JSON字符串实现

     1  protected  string DataTable2JsonString(DataTable dt)
     2  {
     3       if (dt == null || dt.Rows.Count < 1)
     4       {
     5            return "[]";
     6       }
     7       string strjson = "[";
     8       for (int i = 0; i < dt.Rows.Count; i++)
     9       {
    10            strjson += dt.Rows[i].ToJSON() + ",";
    11       }
    12       strjson = strjson.TrimEnd(',');
    13       strjson += "]";
    14       return strjson;
    15  } 

    4、使用扩展方法

    遍历DataTable历生成JSON字符串的方法,在DataTable结果集十分庞大的时候,耗费的实际非常长

    曾经做了一个测试,一个SQL语句查询的结果有28000条,查询本身花费5秒时间,但序列化的字符串返回前台却需要一分钟甚至更长

    可以使用下面的方法,必须为静态类和静态方法

     1 public static class Common
     2 {
     3 
     4     public static string DataTableToJson(DataTable dt)
     5     {
     6         List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
     7         foreach (DataRow dr in dt.Rows)
     8         {
     9             Dictionary<string, object> result = new Dictionary<string, object>();
    10             foreach (DataColumn dc in dt.Columns)
    11             {
    12                 result.Add(dc.ColumnName, dr[dc]);
    13             }
    14             list.Add(result);
    15         }
    16 
    17         return SerializeToJson(list,100);
    18     }
    19     public static string SerializeToJson(this object obj, int recursionLimit)
    20     {
    21         JavaScriptSerializer serialize = new JavaScriptSerializer();
    22         serialize.RecursionLimit = recursionLimit;
    23         serialize.MaxJsonLength = Int32.MaxValue; 
    24         return serialize.Serialize(obj);
    25     }
    26 }
  • 相关阅读:
    [转帖]gesture recognition
    [转帖]了解AmbiLight知识
    [转帖]AVS音视频编解码技术了解
    [笔记]新概念英语听力
    ES 学习记录
    Spring Aop 错误之:No MethodInvocation found ... the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST
    AOP无法切入同类调用方法解决办法
    多数据源 Spring 1.x 和 spring 2.x区别
    Intellij IDEA 在一个窗口添加多个项目并全部加入version control
    PageHelper 分页和排序之间的关系
  • 原文地址:https://www.cnblogs.com/yaotome/p/10074117.html
Copyright © 2011-2022 走看看