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/p/2966755.html