内容整理自博客园内园友的博客
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
在将Object序列化成JSON时普遍是使用以下几种方式:
1. 第三方组件Newtonsoft.Json.dll来序列化。
2. 直接用StringBuilder拼接字符串。
3. .NET3.5中的DataContractJsonSerializer
很多人使用的是第三方组件来序列化,但.NET3.5中已经提供了对序列化及反序列化很好的支持,直接使用就行了,而拼接字符串的方式就更原始了,要对一些字符串进行处理也容易出错。所以还是选择了DataContractJsonSerializer,感觉非常方便。下面就看怎么来实了:
首先创建项目,添加必要的程序集引用:System.ServiceModel.Web及System.Runtime.Serialization
[Serializable]
publicclass User{ public intUserId{get;set;}}
当然把[Serializable]去掉,结果就正常了,可这样实体类就不能实例化了?当然我们可以用其它方法来解决这一问题,用WCF中的数据契约声明实体就行(别忘了在所有属性上加上[DataMember]不然这些属性都不可访问哦。)[DataContract]
public class User
{
[DataMember]
publicint UserId{get;set;}
}
这种方式可以用来实例化model类,而不适合来处理datatable
List<User> users = new List<User>();
Users.Add( new User{UserID=1;});
string json = JsonHelper.Serialize(users);
下面有一个类可以做基本的处理:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
public static string String2Json( string s)
{
StringBuilder sb = new StringBuilder(s.Length + 20 );
var query = from c in s
select c;
sb.Append( ' \" ' );
foreach ( char c in query)
{
switch (c)
{
case ' \" ' :
sb.Append( " \\\ "" );
break ;
case ' \\ ' :
sb.Append( " \\\\ " );
break ;
case ' / ' :
sb.Append( " \\/ " );
break ;
case ' \b ' :
sb.Append( " \\b " );
break ;
case ' \f ' :
sb.Append( " \\f " );
break ;
case ' \n ' :
sb.Append( " \\n " );
break ;
case ' \r ' :
sb.Append( " \\r " );
break ;
case ' \t ' :
sb.Append( " \\t " );
break ;
default :
sb.Append(c);
break ;
}
}
sb.Append( ' \" ' );
return sb.ToString();
}
public static string Serialize < T > (T data)
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, data);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static T Deserialize < T > ( string json)
{
T obj = Activator.CreateInstance < T > ();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
}
private string DataTable2Json(DataTable dt)
{
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.Append( " {\ "" );
jsonBuilder.Append(dt.TableName);
jsonBuilder.Append( " \ " :[ " );
for ( int i = 0 ; i < dt.Rows.Count; i ++ )
{
jsonBuilder.Append( " { " );
for ( int j = 0 ; j < dt.Columns.Count; j ++ )
{
jsonBuilder.Append( " \ "" );
jsonBuilder.Append(dt.Columns[j].ColumnName);
jsonBuilder.Append( " \ " :\ "" );
jsonBuilder.Append(dt.Rows[i][j].ToString());
jsonBuilder.Append( " \ " , " );
}
jsonBuilder.Remove(jsonBuilder.Length - 1 , 1 );
jsonBuilder.Append( " }, " );
}
jsonBuilder.Remove(jsonBuilder.Length - 1 , 1 );
jsonBuilder.Append( " ] " );
jsonBuilder.Append( " } " );
return jsonBuilder.ToString();
}