c#序列化
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");
}
}
浙公网安备 33010602011771号