序列化

序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用   HTTP   通过   Internet   在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。  
   
  XML   序列化仅将对象的公共字段和属性值序列化为   XML   流。XML   序列化不包括类型信息。例如,如果您有一个存在于   Library   命名空间中的   Book   对象,将不能保证它将会被反序列化为同一类型的对象。  
   
  注意   XML   序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。若要序列化对象的所有字段和属性(公共的和私有的),请使用   BinaryFormatter   而不是   XML   序列化。  
  XML   序列化中最主要的类是   XmlSerializer   类,它的最重要的方法是   Serialize   和   Deserialize   方法。XmlSerializer   生成的   XML   流符合   WWW   联合会   (www.w3.org)   XML   架构定义语言   (XSD)   1.0   建议。另外,生成的数据类型符合标题为“XML   Schema   Part   2:   Datatypes”(XML   架构第二部分:数据类型)的文档。  
   
  对象中的数据是用编程语言构造(如类、字段、属性、基元类型、数组,甚至   XmlElement   或   XmlAttribute   对象形式的嵌入   XML)来描述的。您可以创建自己的用属性批注的类,或者使用   XML   架构定义工具基于现有   XML   架构   (XSD)   生成类。  
   
  如果您有   XML   架构,就可运行   XML   架构定义工具生成一组强类型化为架构并用属性批注的类。当序列化这样的类的实例时,生成的   XML   符合   XML   架构。使用这样的类,就可针对容易操作的对象模型进行编程,同时确保生成的   XML   符合   XML   架构。这是使用   .NET   框架中的其他类(如   XmlReader   和   XmlWriter   类)分析和写   XML   流的一种替换方法。(有关使用这些类的更多信息,请参阅使用   .NET   框架中的   XML。)这些类使您可以分析任何   XML   流。与此相反,当需要   XML   流符合已知的   XML   架构时,请使用   XmlSerializer。  
   
  属性控制由   XmlSerializer   类生成的   XML   流,使您可以设置   XML   流的   XML   命名空间、元素名、属性名等。有关这些属性和它们如何控制   XML   序列化的更多信息,请参阅使用属性控制   XML   序列化。有关那些用于控制生成的   XML   的属性表,请参阅控制   XML   序列化的属性。  
   
  XmlSerializer   类可进一步序列化对象并生成编码的   SOAP   XML   流。生成的   XML   符合标题为“Simple   Object   Access   Protocol   (SOAP)   1.1”的   WWW   联合会文档的第   5   节。有关此过程的更多信息,请参阅用   XML   序列化生成   SOAP   消息。有关控制生成的   XML   的属性表,请参阅控制编码的   SOAP   序列化的属性。  
   
  XmlSerializer   类生成由   XML   Web   services   创建和传递给   XML   Web   services   的   SOAP   消息。若要控制   SOAP   消息,可将属性应用于   XML   Web   services   文件   (.asmx)   中的类、返回值、参数和字段。既可使用在“控制   XML   序列化的属性”中列出的属性,也可使用在“控制编码的   SOAP   序列化的属性”中列出的属性,原因是   XML   Web   services   可能使用文本样式,也可能使用编码的   SOAP   样式。有关使用属性控制   XML   Web   services   所生成的   XML   的更多信息,请参阅   XML   Web   services   的   XML   序列化。有关   SOAP   和   XML   Web   services   的更多信息,请参阅自定义   SOAP   消息。  
   
  序列化的简单类  
  下面的示例显示一个具有公共字段的简单类:  
   
  [C#]  
  public   class   OrderForm{  
        public   DateTime   OrderDate;  
  }  
  当将此类的实例序列化时,该实例可能类似于下面这样:  
   
  <OrderForm>  
        <OrderDate>12/12/01</OrderDate>  
  </OrderForm>  
  有关序列化的更多示例,请参阅   XML   序列化的示例。  
   
  可以序列化的项  
  使用   XmLSerializer   类,可将下列项序列化。    
   
  公共类的公共读/写属性和字段    
  实现   ICollection   或   IEnumerable   的类(请注意,只序列化集合,不序列化公共属性。)    
  XmlElement   对象    
  XmlNode   对象    
  DataSet   对象    
  序列化和反序列化对象  
  若要序列化对象,首先创建要序列化的对象并设置它的公共属性和字段。为此,必须确定要用以存储   XML   流的传输格式(作为流还是作为文件)。例如,如果   XML   流必须以永久形式保存,则创建   FileStream   对象。当您反序列化对象时,传输格式确定您将创建流还是文件对象。确定了传输格式之后,就可以根据需要调用   Serialize   或   Deserialize   方法。  
   
  序列化对象    
   
  创建对象并设置它的公共字段和属性。    
  使用该对象的类型构造   XmlSerializer。有关更多信息,请参阅   XmlSerializer   类构造函数。    
  调用   Serialize   方法以生成对象的公共属性和字段的   XML   流表示形式或文件表示形式。下面的示例创建一个文件。    
  MySerializableClass   myObject   =   new   MySerializableClass();  
  //   Insert   code   to   set   properties   and   fields   of   the   object.  
  XmlSerializer   mySerializer   =   new    
  XmlSerializer(typeof(MySerializableClass));  
  //   To   write   to   a   file,   create   a   StreamWriter   object.  
  StreamWriter   myWriter   =   new   StreamWriter("myFileName.xml");  
  mySerializer.Serialize(myWriter,   myObject);  
  反序列化对象    
   
  使用要反序列化的对象的类型构造   XmlSerializer。    
  调用   Deserialize   方法以产生该对象的副本。在反序列化时,必须将返回的对象强制转换为原始对象的类型,如下面的示例中所示。下面的示例将该对象反序列化为文件,但是也可以将该对象反序列化为流。    
  [C#]  
  MySerializableClass   myObject;  
  //   Construct   an   instance   of   the   XmlSerializer   with   the   type  
  //   of   object   that   is   being   deserialized.  
  XmlSerializer   mySerializer   =    
  new   XmlSerializer(typeof(MySerializableClass));  
  //   To   read   the   file,   create   a   FileStream   object.  
  FileStream   myFileStream   =    
  new   FileStream("myFileName.xml",   FileMode.Open);  
  //   Call   the   Deserialize   method   and   cast   to   the   object   type.  
  myObject   =   (MySerializableClass)    
  mySerializer.Deserialize(myFileStream)  
  有关   XML   序列化的更多示例,请参阅   XML   序列化的示例。  
   
  使用   XML   序列化的好处  
  XmlSerializer   类在您将对象序列化为   XML   时为您提供完整而灵活的控制。如果您正在创建   XML   Web   services,则可以将控制序列化的属性应用于类和成员以确保   XML   输出符合特定的架构。  
   
  例如,XmlSerializer   使您能够:    
   
  指定应将字段或属性编码为特性还是元素。    
  指定要使用的   XML   命名空间。    
  如果字段或属性名不合适,则指定元素或特性的名称。    
  XML   序列化的另一个好处是:只要生成的   XML   流符合给定的架构,则对于所开发的应用程序就没有任何约束。假定有这样一个用于描述图书的架构,它具有标题、作者、出版商和   ISBN   编号元素。您可以开发一个以您所希望的任何方式(例如,作为图书订单,或作为图书清单)处理   XML   数据的应用程序。在任一种情况下,唯一的要求是   XML   流应当符合指定的   XML   架构定义语言   (XSD)   架构。  
   
  XML   序列化注意事项  
  使用   XmlSerializer   类时,应考虑下列情况:    
   
  已序列化的数据中仅包含类和数据的形状。不包括类型标识和程序集信息。    
  只能序列化公共属性和字段。如果需要序列化非公共数据,请使用   BinaryFormatter   类而不是   XML   序列化。    
  类必须有一个将由   XmlSerializer   序列化的默认构造函数。    
  不能序列化方法。    
  XmlSerializer   可以以不同方式处理实现   IEnumerable   或   ICollection   的类(条件是这些类满足某些要求)。实现   IEnumerable   的类必须实现带单个参数的公共   Add   方法。Add   方法的参数必须与从   GetEnumerator   方法返回的   IEnumerator.Current   属性所返回的类型一致(多态)。除实现   IEnumerable   外还实现   ICollection   的类(如   CollectionBase)必须有一个取整数的公共   Item   索引属性(在   C#   中为索引器),并且它必须有一个整数类型的公共   Count   属性。Add   方法的参数必须与从   Item   属性返回的类型相同或与该类型的某个基的类型相同。对于实现   ICollection   的类,要序列化的值将从索引   Item   属性检索,而不是通过调用   GetEnumerator   来检索。另外请注意,除返回另一个集合类(实现   ICollection   的集合类)的公共字段之外,将不序列化公共字段和属性。有关示例,请参阅   XML   序列化的示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值