先解释下概念:
序列化就是把一个对象保存到一个文件或数据库字段中去,方便我们的存储与信息交换。反序列化就是在适当的时候把这个文件再转化成原来的对象使用。也可以说,序列化的目的就是为了跨进程传递格式化数据。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
简单来说:
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
放代码:
二进制序列化
namespace 序列化 { public class Program { static void Main(string[] args) { List<Person> list=new List< Person>(); list.Add(new Person() { Name = "1", Age = 19 }); list.Add(new Person() { Name = "2", Age = 29}); list.Add(new Person() { Name = "3", Age = 16 }); #region 二进制序列化 BinaryFormatter bf=new BinaryFormatter(); using(FileStream fsWrite=File.OpenWrite("1.bin")) { bf.Serialize(fsWrite,list);//序列化 //bf.Deserialize();//反序列化 Console.WriteLine("ok"); Console.ReadKey(); } #endregion } #region Person类 public class Person { //三个属性 public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } //两个方法 public void SayHi() { Console.WriteLine("我是:{0}", Name); } public void SayHello() { Console.WriteLine("Hello"); } } #endregion } }
二进制序列化要求:
1.被序列化的对象的类型必须标记为可序列化的。
2.二进制序列化会把属性对应的字段序列化到文件中,类型中最好不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
3.当序列化一个对象的时候,这个对象本身以及的所有父类都必须标记为可序列化的。
4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
5.通过[NonSerialized]把某个字段标记为不可序列化的。
JavaScript序列化
#region 使用JavaScript序列化 //使用JavaScript序列化 JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); string str = jsSerializer.Serialize(list); //jsSerializer.Deserialize();//反序列化 File.WriteAllText("list.txt", str); Console.WriteLine(str); Console.ReadKey();
使用XML序列化
//使用XML序列化 XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());//拿到type using(FileStream fsWrite=File.OpenWrite("1.xml")) { xmlSerializer.Serialize(fsWrite,list); //xmlSerializer.Deserialize();//反序列化 } Console.WriteLine("ok"); Console.ReadKey(); #endregion
说点什么
欢迎讨论