xml序列化;javascript序列化;二进制序列化
序列化,就是把一个对象转换成另外一种格式的过程,转换成不同的格式就叫做不同的序列化,比如xml格式,叫做xml序列化。JavaScript的json格式,叫做JavaScript序列化。转换成二进制byte[]字节,叫做二进制序列化。
序列化只序列化对象属性(或者说是序列化了对象中的状态信息(字段、属性就是用来存储状态的)),而方法并没有序列化。
序列化后的目的,是为了把数据以另外一种格式来表示,方便存储与交换数据,所以序列化只序列化那些存储数据的成员,一般就是属性,不会序列化方法的。
1、二进制序列化 (利用BinaryFormatter类)
//二进制序列化 (必须添加 [Serializable]特性用于标记。object,int等类型都已经添加此特性了)
List list = new List() { "上海", "中国", "西安" }; BinaryFormatter bf = new BinaryFormatter(); using (FileStream fsWrite = File.OpenWrite("list.bin")) { bf.Serialize(fsWrite, list);//将list对象序列化到文件流中 //bf.Deserialize();//反序列化 }
//二进制序列化要求:
//1.被序列化的对象的类型必须标记为可序列化的。
//2.二进制序列化会把属性对应的字段序列化到文件中,所以最好类型中不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
//3.当序列化一个对象的时候,这个对象本身以及所有父类都必须标记为可序列化的。
//4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
//5.通过[NonSerialized]把某个字段标记为不可序列化的。
//二进制反序列化(必须添加对象类型的引用)
//反序列化的时候,需要创建原来被序列化的类型的对象,所以反序列化的时候需要引用被序列化的类型的对象。正是因为如此,所以在二进制序列化的时候,那些属性名、方法等根本不需要序列化,只需要把那些状态信息(数据→字段的值)序列化了就好了,对于那些方法等信息,在反序列化时,创建对象的时候会自动创建,然后根据序列化文件中的字段的值,进行赋值。这就是反序列化。
BinaryFormatter bf = new BinaryFormatter(); using (FileStream fsRead = File.OpenRead("words.bin")) { object obj = bf.Deserialize(fsRead); List<string> list = obj as List<string>; foreach (var item in list) { Console.WriteLine(item); } }
2、xml序列化 (xmlSerializer)
XmlSerializer xmlSerializer = new XmlSerializer(list.GetType()); XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>)); using (FileStream fsWrite = File.OpenWrite("list.xml")) { xmlSerializer.Serialize(fsWrite, list); //xmlSerializer.Deserialize();//反序列化 }
3、使用JavaScript 序列化。(JavaScriptSerializer )
JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); string str = jsSerializer.Serialize(list); //jsSerializer.Deserialize();//反序列化 File.WriteAllText("list.txt", str);
补充:二进制序列化例子
Person person = new Person(); person.Name = "张三"; person.Age = 19; person.Email = "zhangsan@yahoo.com"; person.MyCar = new Car() { Brand = "时风" }; //二进制序列化步骤: //1.创建二进制序列化器 BinaryFormatter bf = new BinaryFormatter(); //我们希望将对象序列化到一个文件上,所以要创建一个文件流 using (FileStream fsWrite = File.OpenWrite("person.bin")) { //开始执行二进制序列化 bf.Serialize(fsWrite, person); } Console.WriteLine("序列化完毕!"); Console.ReadKey();
自定义类
[Serializable] public class Car { private string _brand; public string Brand { get { return _brand; } set { _brand = value; } } } [Serializable] public class Animal { } [Serializable] //特性,当为某个类加了该特性后,这个类就标记为了可序列化的了。 public class Person : Animal { private Car _myCar; public Car MyCar { get { return _myCar; } set { _myCar = value; } } //[NonSerialized]//当前这个字段就不会被序列化了。 private string _name; public string Name { get { return _name; } set { _name = value; } } //[NonSerialized] private int _age; public int Age { get { return _age; } set { _age = value; } } //[NonSerialized] private string _email; public string Email { get { return _email; } set { _email = value; } } private string _gender = "男"; public int _height = 180; public void SayHi() { Console.WriteLine("大家好,我叫:{0}", Name); } public void SayHello() { Console.WriteLine("Hello"); } }