在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。 什么是序列化? 我们都知道对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化。通俗点就是把人的魂—对象,收伏成一个石子,可传输的介质。 什么叫反序列化? 就是再把介质中的东西还原成对象把石子还原成人的过程。 在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。 1、是使用BinaryFormatter进行串行化; 2、使用SoapFormatter进行串行化; 3、使用XmlSerializer进行串行化。 第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息。第二种将数据流格式化为XML存储。第三种其实和第二种差不多也是XML的格式存储,只不过比第二种的XML格式要简化很多(去掉了SOAP特有的额外信息)。可以使用[Serializable]属性将类标志为可序列化的。 1、使用BinaryFormatter进行串行化 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace 序列化反序列化 { class Program { static void Main(string[] args) { xueliehua(); fanxuliehua(); Console.Read(); } private static void xueliehua() { var person = new Person { Sno = "102923", Name = "zgp", Sex = "男" }; //创建一个格式化程序实例 IFormatter formatter = new BinaryFormatter(); //创建一个文件流 Stream stream = new FileStream("d:/xuliehua.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); formatter.Serialize(stream, person); stream.Close(); } public static void fanxuliehua() { IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("d:/xuliehua.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); var stillperson = (Person)formatter.Deserialize(stream); Console.WriteLine(stillperson.ToString()); } } [Serializable] public class Person { public string Sno { get; set; } public string Name { get; set; } public string Sex { get; set; } public override string ToString() { //return base.ToString(); return "我的学号是" + Sno + "我的名字是" + Name + "我的性别是" + Sex; } } } 2、使用SoapFormatter进行串行化 可序列化类代码: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Xml.Serialization; [Serializable] public class Person { private string name; public string Name { get { return name; } set { name = value; } } public string Sex; public int Age = 31; public Course[] Courses; public Person() { } public Person(string Name) { name = Name; Sex = "男"; } } [Serializable] public class Course { public string Name; [XmlIgnore] public string Description; public Course() { } public Course(string name, string description) { Name = name; Description = description; } } 序列化和反序列化方法代码: public void XMLSerialize() { Person c = new Person("cyj"); c.Courses = new Course[2]; c.Courses[0] = new Course("英语", "交流工具"); c.Courses[1] = new Course("数学","自然科学"); XmlSerializer xs = new XmlSerializer(typeof(Person)); Stream stream = new FileStream("c:\\cyj.XML",FileMode.Create,FileAccess.Write,FileShare.Read); xs.Serialize(stream,c); stream.Close(); } public void XMLDeserialize() { XmlSerializer xs = new XmlSerializer(typeof(Person)); Stream stream = new FileStream("C:\\cyj.XML",FileMode.Open,FileAccess.Read,FileShare.Read); Person p = xs.Deserialize(stream) as Person; Response.Write(p.Name); Response.Write(p.Age.ToString()); Response.Write(p.Courses[0].Name); Response.Write(p.Courses[0].Description); Response.Write(p.Courses[1].Name); Response.Write(p.Courses[1].Description); stream.Close(); } 这里Course类的Description属性值将始终为null,生成的xml文档中也没有该节点,如下图: <?xml version="1.0"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Sex>男</Sex> <Age>31</Age> <Courses> <Course> <Name>英语</Name> <Description>交流工具</Description> </Course> <Course> <Name>数学</Name> <Description>自然科学</Description> </Course> </Courses> <Name>cyj</Name> </Person>
注:本文章属个人学习总结,部分内容参考互联网上的相关文章。 其中如果发现个人总结有不正确的认知或遗漏的地方请评论告知,欢迎交流。 |
请发表评论