已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XML序列化.NET框架提供的一种形式的序列化是XML序列化。在这种类型的序列化里,对象状态被以XML格式保存。这使得被序列化的对象能够被不同的系统取得并修改,甚至是那些不是用.NET编写的系统。另外一个优势是被序列化的对象对于人来说是可读和可写的因此更新对象的方式莫过于打开写字板更改其值。XML序列化常常被来远程控制项目和Web服务项目里,虽然你可能会在别的地方发现它,比如DataSet封送。在与Xpath查询和Predicate方法一起使用的时候,XML序列化能够被用来实现面向对象的数据库。使用XML序列化在.NET框架里利用内置的XML序列化方法相对较为容易。你只需要熟悉一些类和属性就可以开始使用简单的XML序列化了:System.Xml.Serialization命名空间:含有使用XML序列化所需要的类和功能。这个命名空间应该被放在使用XML序列化的类的顶部的一个“using”命令里。XmlSerializer类:提供将对象序列化和反序列化的功能。XmlIgnore属性:告诉XmlSerializer类跳过你不希望序列化的成员。这个列表只不过让你对序列化有一个初步的了解。还有更多的对象可以供你在使用XML序列化的时候使用。列表A是将Customer对象序列化的一个简单例子。这个Customer对象在下载文件的示例应用程序里被定义。列表A1. Customer customer = newCustomer();2. customer.FirstName = Zach;3. customer.LastName = Smith;4. XmlSerializer serializer = newXmlSerializer(typeof(Customer);5. StringWriter writer = newStringWriter();6. serializer.Serialize(writer, customer);7. Console.WriteLine(writer.ToString();复制代码正如你看到的,XML序列化是一个很简单的过程。我们只需要创建一个需要被序列化的对象,创建用于这种类型对象的XmlSerializer,并调用 XmlSerializer.Serialize。被序列化的对象然后被写到提供的Stream里在本文中是一个叫做“writer”的 StringWriter。如果你看看被序列化的对象,你会注意到它很容易读懂。下面就是被序列化的Customer对象的内容:1. 2. 3. 4. Smith5. Zach6. 复制代码在这里,你会看到Customer对象的属性被序列化,也就是Order对象的列表。如果你将这个输出与Customer类的定义比较一下,你会注意到“Income”属性没有被列出来。这是因为Income属性本身还带有一个XmlIgnore属性,它会让XML序列化库在序列化的时候跳过 Income属性。在序列化过程中跳过属性的一个副作用是这个属性不会被反序列化,所以会在反序列化的时候总是带有默认的值。Orders节点是空的,因为这个客户没有下订单。但是如果我们将含有订单的Customer对象序列化,那么我们就会得到类似下面的输出:1. 2. 3. 4. 5. 34.566. 7. 8. 156.569. 10. 11. Smith12. Zach13. 复制代码要注意每个订单对象都被单独序列化并放在被序列化的Customer对象的Orders节点里。如果你想要反序列化这个Customer对象,那么相关联的Order对象也会被反序列化。注:要被序列化或者反序列化的每个对象都必须有一个空的默认构造函数。如果对象不实现一个空的构造函数,那么就会引发异常。反序列化对象将对象反序列化就和将它们序列化一样简单。下面的代码(列表B)显示了如何将反序列化保存在文件里的对象:列表B1. XmlSerializer serializer = new XmlSerializer(typeof(Customer);2. FileStream file = File.OpenRead(fileToWrite);3. Customer customer = (Customer)serializer.Deserialize(file);4. file.Close();复制代码上面这段代码与前面的序列化代码的唯一不同之处在于我们在这里调用了XmlSerializer.Deserialize。这个方法会返回一个对象,我们然后就必须转到将要使用的对象类型上。其他用法在某些情况下,通过实现XML序列化来保存和检索设置文件是很有用的。例如,你可以只用创建一个含有所需属性的类并将它序列化到磁盘上,而不需要编写一个自定义的XML分析例程来寻找和分析设置文件。这还允许你在需要的时候对文件进行手动编辑,让你不需要自己编写任何XML分析代码。这种方式可以用于任何类型的信息,应用程序可能需要保存从一个执行到另一个执行的这种类型的信息。正如我先前所说的,将XML序列化与Predicate方法(被编译的搜索)、Xpath(特别搜索),以及XmlDocument(提供器)对象一起使用,你可以创建一个面向对象的数据库,这是完全可行的。我已经在进行这样一个项目,所以我会在以后的文章里探讨它背后所隐藏的实现和思想。其目标是利用不超过200行的C#代码就创建完全可实现的面向对象的数据库。发挥XML序列化的优势既然你已经熟悉XML序列化了,那么我希望你能够在自己的项目里找到它的用武之地。从我个人来讲,我通过对复杂的应用程序设置使用XML序列化节省了大量的时间,这还不算上我应用程序的其他一些模块。所以我希望本文能够不让你犯我曾经犯过的错误!序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。.NET框架提供了两种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储;第三种其实和第二种差不多也是XML的格式存储,只不过比第二种的XML格式要简化很多(去掉了SOAP特有的额外信息)。可以使用Serializable属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用NonSerialized属性来标志,2、可以使用XmlIgnore来标志。1、使用BinaryFormatter进行串行化下面是一个可串行化的类: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.IO;using System.Runtime.Serialization.Formatters.Binary;/*/ / ClassToSerialize 的摘要说明/ Serializablepublic class ClassToSerializepublic int id = 100;public string name = Name;NonSerializedpublic string Sex = 男;下面是串行化和反串行化的方法:public void SerializeNow()ClassToSerialize c = new ClassToSerialize();FileStream fileStream = new FileStream(c:temp.dat, FileMode.Create);BinaryFormatter b = new BinaryFormatter();b.Serialize(fileStream, c);fileStream.Close();public void DeSerializeNow()ClassToSerialize c = new ClassToSerialize();c.Sex = kkkk;FileStream fileStream = new FileStream(c:temp.dat, FileMode.Open, FileAccess.Read, FileShare.Read);BinaryFormatter b = new BinaryFormatter();c = b.Deserialize(fileStream) as ClassToSerialize;Response.Write();Response.Write(c.Sex);fileStream.Close();调用上述两个方法就可以看到串行化的结果:Sex属性因为被标志为NonSerialized,故其值总是为null。2、使用SoapFormatter进行串行化和BinaryFormatter类似,我们只需要做一下简单修改即可:a.将using语句中的.Formatter.Binary改为.Formatter.Soap;b.将所有的BinaryFormatter替换为SoapFormatter.c.确保报存文件的扩展名为.xml经过上面简单改动,即可实现SoapFormatter的串行化,这时候产生的文件就是一个xml格式的文件。3、使用XmlSerializer进行串行化关于格式化器还有一个问题,假设我们需要XML,但是不想要SOAP特有的额外信息,那么我们应该怎么办呢?有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:a.添加System.Xml.Serialization命名空间。b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。下面看示例:要序列化的类: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;Serializablepublic class Personprivate string name;public string Namegetreturn name;setname = value;public string Sex;public int Age = 31;public Course Courses;public Person()public Person(string Name)name = Name;Sex = 男;Serializablepublic class Coursepublic string Name;XmlIgnorepublic 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 Course2;c.Courses0 = new Course(英语, 交流工具);c.Courses1 = 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.Courses0.Name);Response.Write(p.Courses0.Description);Response.Write(p.Courses1.Name);Response.Write(p.Courses1.Description);stream.Close();这里Course类的Description属性值将始终为null,生成的xml文档中也没有该节点,如下图:男31英语交流工具数学自然科学cyj4、自定义序列化如果你希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData. 如果类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。示例如下:实现ISerializable的类: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.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;/*/ / Employee 的摘要说明/ Serializablepublic class Employee:ISerializablepublic int EmpId=100;public string EmpName=刘德华;NonSerializedpublic string NoSerialString = NoSerialString-Test;public Employee()/ TODO: 在此处添加构造函数逻辑/private Employee(SerializationInfo info, StreamingContext ctxt)EmpId = (int)info.GetValue(EmployeeId, typeof(int);EmpName = (String)info.GetValue(EmployeeName,typeof(string);/NoSerialString = (String)info.GetValue(EmployeeString,typeof(string);public
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业行政物资申请审批与领用工具
- 跨境电子商务合作承诺书5篇
- 工厂生产安全检查与隐患排除清单
- 2026届北京一零一中学化学高二上期末统考试题含答案
- 慢性病患者病房护理注意事项
- 2026届贵州省兴仁市凤凰中学高一化学第一学期期末检测试题含解析
- 干眼症分级护理与治疗配合策略
- 观护理安全事件课件:学会识别护理安全隐患
- 晨僵症状的护理与缓解策略
- 慢性阻塞性肺疾病合并呼衰的护理措施
- 应急预案评审申请
- 富氢水讲解课件
- 音视频制作项目策划方案
- 公司述职报告生产总监
- 塔吊拆除安全教育培训课件
- 秋冬驾驶人安全培训课件
- 七年级上册历史知识点考点梳理背默清单
- 教育科技公司合伙协议书
- 投资台球室合伙合同范本
- GB/T 29730-2025冷热水用分集水器
- 药厂无菌操作培训课件
评论
0/150
提交评论