C#XML序列化
东去春来,春雨绵绵,又是崭新的一年,喜欢雨天,不仅可以懒懒的宅在宿舍了,更是充满的淡淡的诗意,总让人觉得流恋,回想往事如过眼云烟。近来看甄嬛传,里面让人流泪的颇多的,让人感受也是颇多,有些画面也是令人难以忘怀,看的近来思家情节骤增,甄嬛当时的多么的深爱皇帝,是皇帝伤她至深,每每回忆便有些怜惜。
好吧,扯远了,切入正题,今天就写写关于XML序列化吧,序列化有对象序列化,有XML序列化,对象序列化就是在类上标记 [Serializable]标记的,一般用于对象的持久存储与网络传输。
XML序列化需要引用System.Xml程序集,System.Xml.Serialization命名空间,这里我们主要使用XmlSerializer类。
下面看下CSDN对XmlSerializer内几个常用到序列化与反序列化函数成员的定义
序列化函数的定义
Serialize(Object, XmlSerializationWriter) | 基础结构。 使用指定的 XmlSerializationWriter 序列化指定的 Object 并将 XML 文档写入文件。 | |
Serialize(Stream, Object) | 使用指定的 Object 并将 XML 文档写入文件。 | |
Serialize(TextWriter, Object) | 使用指定的 Object 并将 XML 文档写入文件。 | |
Serialize(XmlWriter, Object) | 使用指定的 XmlWriter 序列化指定的 Object 并将 XML 文档写入文件。 | |
Serialize(Stream, Object, XmlSerializerNamespaces) | 使用引用指定命名空间的指定 Object 并将 XML 文档写入文件。 | |
Serialize(TextWriter, Object, XmlSerializerNamespaces) | Serializes the specified Object and writes the XML document to a file using the specified TextWriter and references the specified namespaces. | |
Serialize(XmlWriter, Object, XmlSerializerNamespaces) | Serializes the specified Object and writes the XML document to a file using the specified XmlWriter and references the specified namespaces. | |
Serialize(XmlWriter, Object, XmlSerializerNamespaces, String) | 使用指定的 XmlWriter 和指定命名空间及编码样式序列化指定对象并将 XML 文档写入文件。 | |
Serialize(XmlWriter, Object, XmlSerializerNamespaces, String, String) | 使用指定的 XmlWriter、XML 命名空间和编码序列化指定的 Object 并将 XML 文档写入文件。 |
反序列化函数的定义
Deserialize(Stream) | 反序列化指定 Stream 包含的 XML 文档。 | |
Deserialize(TextReader) | Deserializes the XML document contained by the specified TextReader. | |
Deserialize(XmlReader) | 反序列化指定 XmlReader 包含的 XML 文档。 | |
Deserialize(XmlSerializationReader) | 基础结构。 反序列化指定 XmlSerializationReader 包含的 XML 文档。 | |
Deserialize(XmlReader, String) | 反序列化指定 XmlReader 和编码样式包含的 XML 文档。 | |
Deserialize(XmlReader, XmlDeserializationEvents) | 反序列化一个由指定的 XmlReader 包含的 XML 文档,并允许重写反序列化过程中发生的事件。 | |
Deserialize(XmlReader, String, XmlDeserializationEvents) | 基础结构。 使用指定的 XmlReader 包含的数据反序列化该对象 |
可以看出定义的接口还挺多,这里提供两个常用的方法可以将指定对象序列化成XML格式字符串,也可以将指定XML格式字符串反序列化成指定对象
public static string GetXmlStringFromObject<T>(T t) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); StringBuilder sb = new StringBuilder(); using (XmlWriter xmlWriter = XmlWriter.Create(sb)) { xmlSerializer.Serialize(xmlWriter, t); } return sb.ToString(); } public static T GetObecctFromXmlString<T>(string xmlString) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (StringReader stringReader = new StringReader(xmlString)) { using (XmlReader xmlReader = XmlReader.Create(stringReader)) { return (T)xmlSerializer.Deserialize(xmlReader); } } }
现在就介绍下如何定义XML文件与类的映射关系,现有以下文档结构
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<propertys>
<property name="BankDir" value="Banks\Spdb"/>
<property name="CcmxExtension" value=".ccmx"/>
</propertys>
<configuration>
如何定义成类呢
首先定义根节点
[XmlRoot("configuration")]//这里指定了XML的根节点为configuration public class Configuration { [XmlElement("propertys")]//这里指定一个根节点下的一个元素为propertys public Propertys Propertys { get; set; } }
可以从文档看出propertys是一个集合 ,我们就可以这样定义
[XmlType("propertys")] public class Propertys { [XmlElement("property")] public Property[] Property { get; set; } }
其中这里的Property[]也可以定义成其他集合类型比如IList。
最后定义Property
public class Property { [XmlAttribute("name")] public string Name { get; set; } [XmlAttribute("value")] public string Value { get; set; } }
这样基本的XML结构类就定义好了
使用的时候我们就可以直接调用以上定义好的方法了
var config = XmlHelper.GetObecctFromXmlString<Configuration>(configFileContent);
这样就直接得到指定XML文件的对象实例了,剩下的就可以根据实例去做想做的事情了。
这里介绍一个不太常用的设置XmlWriterSettings
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true;// 这里可以设置XML元素是否缩进 settings.OmitXmlDeclaration = true;//这里是否编写XML声明 settings.NewLineOnAttributes = true;//这里是否将属性写入新行,在属性过多的时候可以方便的查看
我们就可以这样实例化 XmlWriter xmlWriter = XmlWriter.Create(sb, settings)
例如以上配置可以生成类似以下格式XML文件:
<order orderID="367A54" date="2001-05-03"> <price>19.95</price> </order>
大家可以参考msdn参考更详细的介绍
http://msdn.microsoft.com/zh-cn/library/182eeyhh(VS.80).aspx
另外一些有用的文章也不错,留着以后备用
http://www.cnblogs.com/surfsky/archive/2007/03/13/673620.html
本文来自博客园,作者:广林,转载请注明原文链接:https://www.cnblogs.com/guanglin/archive/2013/03/25/2966755.html