【题外话】
以前虽然常用.NET中的序列化,但是常用的BinaryFormatter,也就是二进制文件的序列化,却鲜用XML的序列化。对于XML序列化,.NET中同样提供了一个非常方便的工具XmlSerializer,其可以很方便的将对象序列化为XML文件或将XML文件反序列化为对象。但是XML序列化与二进制序列化却又不少的区别,在刚开始的时候可能会遇到一些困惑。
【文章索引】
.NET提供了非常方便的XML序列化工具XmlSerializer,与二进制序列化工具BinaryFormatter不同,XmlSerializer位于System.Xml.Serialization。根据MSDN上对XmlSerializer的说明来看,“XML 序列化是将对象的公共属性和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。反序列化则是从 XML 输出中重新创建原始状态的对象。可以将序列化视为将对象的状态保存到流或缓冲区的方法”,也就是说,我们可以直接用XmlSerializer序列化对象中的属性和字段。
需要注意的是,只有public的属性和字段才是可以被序列化的,如果设置的为internal或者private的属性或字段都是不能被序列化的。当然,要序列化的对象的类也必须是public的,否则会抛出下列的异常:
除此之外,要想序列化对象中的字段或者属性,还需要保证字段和属性是可读可写的。例如,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 }