1.什么是序列化
我们把变量从内存中变成可存储或传输的过程称之为序列化
2.为什么要序列化
根本原因:需要将变量或对象从内存中取出来进行存储或传输
3.具体应用:
1)对象保存到文件或数据库
2)网络编程时对象跨平台跨语言传输,也即从windows上序列化的对象可到linux上返序列化,用c#序列化的对象可以被java反序列化。
4.序列化的形式:
1)二进制序列化器BinaryFormatter,主要将对象序列化成流的形式,用于数据存储
2)JSON序列化器,主要将对象序列化成字符串,用于数据传输
5.主要区别:
1)二进制序列化器需要向需要序列化的类应用[Serializable]特性,而Json序列化器不需要
2)二进制序列化器只能序列化字段,而不能序列化属性,也就是说当一个类中不显示定义字段,二进制序列化器是不起作用的,JSON序列化器没有这条规定。在二进制序列化器中,若某个字段不需要序列化,可向其应用[NonSerialized]特性,以节省网络传输的带宽以及减少序列化后文件大小
3)二进制序列化后得到的是一个二进制文件,而JSON序列化后得到的是JSON字符串。
字符串有三种形式,分别是:
a.对象
一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束
在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。
var user = {"name":"Acettest","gender":"Male","birthday":"1987-8-8"}
b.数组
设置值的顺序,一个数组以中括号”["开始,并以中括号"]"结束,并且所有的值使用逗号分隔.
var userlist = [
{"user":{"name":"Acettest","gender":"Male","birthday":"1987-8-8"}},
{"user":{"name":"msheng","Male":"Female","birthday":"1987-7-7"}}
]
c.字符串
任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。
(注意: 引号 逗号 冒号 均为英文状态下半角符号, 且只能是双引号 )
var userlist = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}"
7.使用:
1)二进制序列化
a.二进制序列化器
[Serializable]
internal class Book
{
private string name;
public string Name { get { return name; } }
private double price;
public double Price { get { return price; } }
[NonSerialized]
private string iSON;
public string ISON { get { return iSON; } }
public Book(string bookname, double bookprice, string bookison)
{
name = bookname;
price = bookprice;
iSON = bookison;
}
}
//序列化
Book book = new Book("Harry Potter", 25.23, "49384759i4034385u9");
string path = ++ @"";
using (FileStream fs = new FileStream(path, ))
{
BinaryFormatter bf = new BinaryFormatter();
(fs, book);
}
//反序列化
book = null;
using (FileStream fs = new FileStream(path, ))
{
BinaryFormatter bf = new BinaryFormatter();
var specialbook = (Book)(fs);
( + + );
}
b.利用序列化的方式实现深度拷贝
public static T Clone<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
//利用 序列化与反序列化完成引用对象的复制
IFormatter formatter = new BinaryFormatter();
(objectStream, RealObject);
(0, );
return (T)(objectStream);
}
}
2)JSON序列化时,相对而言性能最好的是Newtonsoft库,使用方法如下所示
internal class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
}
Student student = new Student
{
ID = 1,
Age = 23,
Name = "msheng",
Sex = "male"
};
string studentJson = (student);
(studentJson);
string str = "{\"ID\":2,\"Name\":\"Petter\",\"Age\":230,\"Sex\":\"男\"}";
var item = <Student>(str);
(() + + + );
//序列化对象集合
List<Student> oneList = new List<Student>() {
new Student{ ID = 1, Name = "Tim", Age = 260, Sex = "男" },
new Student{ ID = 2, Name = "Bob", Age = 250, Sex = "男" },
new Student{ ID = 3, Name = "Marry", Age = 240, Sex = "女" }
}; //定义对象
string jsonData = (oneList); //序列化
("jsonData:" + jsonData);
foreach (var s in <List<Student>>(jsonData))
{
(() + + + );
}
如有不对之处还请拍砖。