当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
Net提供几种方式的序列化方式包括XML,二进制,SOAP序列化,DataContract系列化和DatacontractJSON序列化
这个文章主要说说DataContractJSON序列化.
JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间快速交换少量数据.javascript对json是原生支持,很适合在js端显示绑定数据
第一步定义一个C#对象,在要 序列化的类上和属性,字段上添加上可以序列化标签。
如果没有添加[DataMember]标签,那么这个属性和字段不会被序列化的
即使是私有属性和字段也会被序列化
[DataContract]
public class Student
{
[DataMember]
public int Age;
[DataMember]
public string Name;
}
}
实例代码:
构造对象
Student s = new Student();
s.Age = 100;
s.Name = "kitty";
string jsonContent = string.Empty;
DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(Student));
using (MemoryStream ms = new MemoryStream())
{
serialize.WriteObject(ms, s);
jsonContent = System.Text.Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(jsonContent);
}
输出的是:{"Age":100,"Name":"kitty"}
如何反序列化,就是将json字符串转换成Student的对象
byte[] temps = System.Text.Encoding.UTF8.GetBytes(jsonContent);
using(Stream reader = new MemoryStream(temps))
{
Student ss = serialize.ReadObject(reader) as Student;
}
泛型,字典集合的序列化
在json序列化中集合类的序列化也是支持的,反应到json中就是js的数组形式
实例代码:
[DataContract]
public class Student
{
// [DataMember]
public int Age;
[DataMember]
public string Name;
[DataMember]
public List<Pupil> Pupils { get; set; }
[DataMember]
public Dictionary<string, Pupil> Dic { get; set; }
[DataMember]
public Dictionary<string, List<Pupil>> DicList { get; set; }
}
Pupil是一个类
public class Pupil
{
public string Name { get; set; }
}
运行结果
{"Dic":[{"Key":"a","Value":{"Name":"a"}},{"Key":"b","Value":{"Name":"b"}}],"DicList":[{"Key":"c","Value":[{"Name":"e"}]}],"Name":"kitty","Pupils":[{"Name":"1"},{"Name":"2"},{"Name":"3"}]}