【题外话】

以前虽然常用.NET中的序列化,但是常用的BinaryFormatter,也就是二进制文件的序列化,却鲜用XML的序列化。对于XML序列化,.NET中同样提供了一个非常方便的工具XmlSerializer,其可以很方便的将对象序列化为XML文件或将XML文件反序列化为对象。但是XML序列化与二进制序列化却又不少的区别,在刚开始的时候可能会遇到一些困惑。

 

【文章索引】

  1. XmlSerializer的作用
  2. 自定义XML结构的映射
  3. 不能序列化的内容
  4. 输出格式的设置

 

【一、XmlSerializer的作用】

.NET提供了非常方便的XML序列化工具XmlSerializer,与二进制序列化工具BinaryFormatter不同,XmlSerializer位于System.Xml.Serialization。根据MSDN上对XmlSerializer的说明来看,“XML 序列化是将对象的公共属性和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。反序列化则是从 XML 输出中重新创建原始状态的对象。可以将序列化视为将对象的状态保存到流或缓冲区的方法”,也就是说,我们可以直接用XmlSerializer序列化对象中的属性和字段。

需要注意的是,只有public的属性和字段才是可以被序列化的,如果设置的为internal或者private的属性或字段都是不能被序列化的。当然,要序列化的对象的类也必须是public的,否则会抛出下列的异常:

.NET中XML序列化的总结

除此之外,要想序列化对象中的字段或者属性,还需要保证字段和属性是可读可写的。例如,readonly的字段是不可以序列化的,没有get或set访问器的属性也是不可以序列化的(当然你可以选择在set访问器里什么也不写,那么虽然能序列化,但是反序列化的时候就成空的啦)。当然,static和const的字段和属性也是不会被序列化的,标记为[Obsolete]的也不会被序列化。此外,除了要求类是public的以外,还需要其有一个无参的构造方法,否则也会抛出异常。

关于XmlSerializer的使用,其实非常简单,只需要几行代码即可实现将一个对象序列化:

 1 void SaveToFile(String filePath, Object obj)
 2 {
 3     FileStream fs = null;
 4 
 5     try
 6     {
 7         fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
 8         XmlSerializer xs = new XmlSerializer(obj.GetType());
 9 
10         xs.Serialize(fs, obj);
11     }
12     finally
13     {
14         if (fs != null)
15         {
16             fs.Close();
17         }
18     }
19 }
View Code

相关文章:

  • 2021-07-03
  • 2022-12-23
  • 2022-01-14
  • 2021-10-11
  • 2021-11-07
猜你喜欢
  • 2022-01-11
  • 2021-07-14
  • 2022-02-28
  • 2021-10-10
  • 2021-05-28
  • 2022-12-23
相关资源
相似解决方案