C#/.NET 将对象序列化成XML和将XML反序列化成对象

知道91 | 站长推荐 | 2014-06-20 | 阅读:13054

在实际的.NET项目中我们可能需要将数据暂时保存在XML中,而不是保存在数据库中,保存在XML中的数据最大的一个好处是跨平台,只要平台能够XML,那么就能实现跨平台数据库的共享。.NET提供了很多操作XML的API,然而我认为操作XML的方法,将对象序列化成XML和将XML反序列化成对象,莫过于下面的例子。

[caption id="attachment_524" align="aligncenter" width="300"].NET XML 序列化与反序列化.NET将对象序列化成XML、将XML反序列化成对象[/caption]

在方法中你只需要使用一句代码就可以完成对象序列化成XML字符串和将对象反序列化成对象,如下面的代码:

// 1. 首先要创建或者得到一个数据对象,这个对象根据你的实际操作的对象来自己设定,当然这个对象也可以是集合,比如IList Person person= new Person() { name="知道91", age="2" }; // 2. 用序列化的方法生成XML string xmlPerson = XmlHelper.XmlSerialize(person, Encoding.UTF8); // 3. 从XML读取数据并且生成对象 Person person2 = XmlHelper.XmlDeserialize(xmlPerson , Encoding.UTF8);

你不用担心序列化的对象是什么结构的,是单个的对象也好,或者是一个集合List,你只需要关心能否存储成xml和能否取出来序列化成对象。只有上面的三行代码是不能运行的,最重要的是XMLHelper,它不是系统库中的类,是需要你自己写的,下面就是XmlHelper的核心代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; using System.IO; using System.Xml; namespace MyMVC { public static class XmlHelper { ///

/// 将一个对象序列化为XML字符串 /// /// 要序列化的对象 /// 编码方式 /// 序列化产生的XML字符串 public static string XmlSerialize(object o, Encoding encoding) { using( MemoryStream stream = new MemoryStream() ) { XmlSerializeInternal(stream, o, encoding); stream.Position = 0; using( StreamReader reader = new StreamReader(stream, encoding) ) { return reader.ReadToEnd(); } } } /// /// 从XML字符串中反序列化对象 /// /// 结果对象类型 /// 包含对象的XML字符串 /// 编码方式 /// 反序列化得到的对象 public static T XmlDeserialize(string s, Encoding encoding) { if( string.IsNullOrEmpty(s) ) throw new ArgumentNullException("s"); if( encoding == null ) throw new ArgumentNullException("encoding"); XmlSerializer mySerializer = new XmlSerializer(typeof(T)); using( MemoryStream ms = new MemoryStream(encoding.GetBytes(s)) ) { using( StreamReader sr = new StreamReader(ms, encoding) ) { return (T)mySerializer.Deserialize(sr); } } } private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding) { if( o == null ) throw new ArgumentNullException("o"); if( encoding == null ) throw new ArgumentNullException("encoding"); XmlSerializer serializer = new XmlSerializer(o.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineChars = "\r\n"; settings.Encoding = encoding; settings.IndentChars = " "; using( XmlWriter writer = XmlWriter.Create(stream, settings) ) { serializer.Serialize(writer, o); writer.Close(); } } /// /// 将一个对象按XML序列化的方式写入到一个文件 /// /// 要序列化的对象 /// 保存文件路径 /// 编码方式 public static void XmlSerializeToFile(object o, string path, Encoding encoding) { if( string.IsNullOrEmpty(path) ) throw new ArgumentNullException("path"); using( FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write) ) { XmlSerializeInternal(file, o, encoding); } } /// /// 读入一个文件,并按XML的方式反序列化对象。 /// /// 结果对象类型 /// 文件路径 /// 编码方式 /// 反序列化得到的对象 public static T XmlDeserializeFromFile(string path, Encoding encoding) { if( string.IsNullOrEmpty(path) ) throw new ArgumentNullException("path"); if( encoding == null ) throw new ArgumentNullException("encoding"); string xml = File.ReadAllText(path, encoding); return XmlDeserialize(xml, encoding); } } }

利用XMLHelper你可以进行下面的操作

  • 将一个对象序列化为XML字符串
  • 从XML字符串中反序列化对象
  • 将一个对象按XML序列化的方式写入到一个文件
  • 读入一个文件,并按XML的方式反序列化对象