序列化和反序列化

  1. 使用序列号和反序列化需要引入的命名空间using System.Web.Script.Serialization;

           需要添加的引用 system.web.Extensions

  1. /// <summary>
            /// DataTable2Json
            /// </summary>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static string DataTable2Json(DataTable dt)
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
                string json = "{Rows:";

                foreach (DataRow dr in dt.Rows)
                {
                    Dictionary<string, object> result = new Dictionary<string, object>();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        result.Add(dc.ColumnName, dr[dc].ToString());
                    }
                    list.Add(result);
                }

                json = json + serializer.Serialize(list) + "}";
                return json;
            }

  2. /// <summary>   
  3. /// 扩展方法,将一个Json字符串反序列化为DataTable   
  4. /// </summary>   
  5. /// <typeparam name="T">类型</typeparam>   
  6. /// <param name="str"></param>   
  7. /// <returns>DataTable</returns>   
  8. public static DataTable DerializeToDataTable<T>(this string str)  
  9. {  
  10.     DataTable dt = new DataTable();  
  11.     if (str[0] == '[')//如果str的第一个字符是'[',则说明str里存放有多个model数据   
  12.     {  
  13.         //删除最后一个']'和第一个'[',顺序不能错。不然字符串的长度就不对了。   
  14.         //因为每个model与model之间是用 ","分隔的,所以改为用 ";"分隔   
  15.         str = str.Remove(str.Length - 1, 1).Remove(0, 1).Replace("},{""};{");  
  16.     }  
  17.     JavaScriptSerializer js = new JavaScriptSerializer();  
  18.     string[] items = str.Split(';');//用";"分隔开多条数据   
  19.     foreach (PropertyInfo property in typeof(T).GetProperties())//反射,获得T类型的所有属性   
  20.     {  
  21.         //创建一个新列,列名为属性名,类型为属性的类型。   
  22.         DataColumn col = new DataColumn(property.Name, property.PropertyType);  
  23.         dt.Columns.Add(col);  
  24.     }  
  25.   
  26.     //循环,一个一个的反序列化   
  27.     for (int i = 0; i < items.Length; i++)  
  28.     {  
  29.         //创建新行   
  30.         DataRow dr = dt.NewRow();  
  31.   
  32.         //反序列化为一个T类型对象   
  33.         T temp = js.Deserialize<T>(items[i]);  
  34.         foreach (PropertyInfo property in typeof(T).GetProperties())  
  35.         {  
  36.             //赋值   
  37.             dr[property.Name] = property.GetValue(temp, null);  
  38.         }  
  39.        dt.Rows.Add(dr);  
  40.     }  
  41.     return dt;  
  42. }  
posted @ 2013-10-29 13:32  一朵小蓝花  阅读(141)  评论(0编辑  收藏  举报