用.NET框架实现序列化(二)

日期: 2007-12-17 来源:TechTarget中国

  在这里,你会看到Customer对象的属性被序列化,也就是Order对象的列表。如果你将这个输出与Customer类的定义比较一下,你会注意到“Income”属性没有被列出来。这是因为Income属性本身还带有一个XmlIgnore属性,它会让XML序列化库在序列化的时候跳过Income属性。在序列化过程中跳过属性的一个副作用是这个属性不会被反序列化,所以会在反序列化的时候总是带有默认的值。

  Orders节点是空的,因为这个客户没有下订单。但是如果我们将含有订单的Customer对象序列化,那么我们就会得到类似下面的输出:

<?xml version="1.0" encoding="utf-16"?>
<Customer xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns_xsd="http://www.w3.org/2001/XMLSchema">
  <Orders>
    <Order>
      <Total>34.56</Total>
    </Order>
    <Order>
      <Total>156.56</Total>
    </Order>
  </Orders>
  <LastName>Smith</LastName>
  <FirstName>Zach</FirstName>
</Customer>

  要注意每个订单对象都被单独序列化并放在被序列化的Customer对象的Orders节点里。如果你想要反序列化这个Customer对象,那么相关联的Order对象也会被反序列化。

  注:要被序列化或者反序列化的每个对象都必须有一个空的默认构造函数。如果对象不实现一个空的构造函数,那么就会引发异常。

  反序列化对象

  将对象反序列化就和将它们序列化一样简单。下面的代码(列表B)显示了如何将反序列化保存在文件里的对象:

  列表B     XmlSerializer serializer = new XmlSerializer(typeof(Customer));
    FileStream file = File.OpenRead(fileToWrite);
    Customer customer = (Customer)serializer.Deserialize(file);
    file.Close();

  上面这段代码与前面的序列化代码的唯一不同之处在于我们在这里调用了XmlSerializer.Deserialize。这个方法会返回一个对象,我们然后就必须转到将要使用的对象类型上。

  其他用法

  在某些情况下,通过实现XML序列化来保存和检索设置文件是很有用的。例如,你可以只用创建一个含有所需属性的类并将它序列化到磁盘上,而不需要编写一个自定义的XML分析例程来寻找和分析设置文件。这还允许你在需要的时候对文件进行手动编辑,让你不需要自己编写任何XML分析代码。这种方式可以用于任何类型的信息,应用程序可能需要保存从一个执行到另一个执行的这种类型的信息。

  正如我先前所说的,将XML序列化与Predicate方法(被编译的搜索)、Xpath(特别搜索),以及XmlDocument(提供器)对象一起使用,你可以创建一个面向对象的数据库,这是完全可行的。我已经在进行这样一个项目,所以我会在以后的文章里探讨它背后所隐藏的实现和思想。其目标是利用不超过200行的C#代码就创建完全可实现的面向对象的数据库。

  发挥XML序列化的优势

  既然你已经熟悉XML序列化了,那么我希望你能够在自己的项目里找到它的用武之地。从我个人来讲,我通过对复杂的应用程序设置使用XML序列化节省了大量的时间,这还不算上我应用程序的其他一些模块。所以我希望本文能够不让你犯我曾经犯过的错误!

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐