首页 > 代码库 > Xml序列化和反序列化

Xml序列化和反序列化

     读取Xml总共有三种方法:XmlTextReader   XmlDoucument   XPath

     今天总结下XmlSerialize,xmlSerialize提供两个方法Deserialize(将xml反序列化成对象)和Serialize(将对象序列化城xml)

      一、Serialize   序列化

             

/// <summary>        ///  transform target object in to xml file        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="targetO"></param>        /// <param name="goalPath"> </param>        /// <returns></returns>        public static void ToXmlString<T>(T targetO, string goalPath)        {            var xmlSerializer = new XmlSerializer(typeof(T));            var xmlSerializerNamespaces = new XmlSerializerNamespaces();            xmlSerializerNamespaces.Add("prefix", "prefixValue");            var settings = new XmlWriterSettings();            //ignore xml avow  <?xml version="1.0" encoding="utf-8"?>            settings.OmitXmlDeclaration = true;            using (var writer = XmlWriter.Create(goalPath, settings))            {                xmlSerializer.Serialize(writer, targetO, xmlSerializerNamespaces);            }        }

 

 序列化后的结果:

<ArrayOfPerson xmlns:prefix="prefixValue">  <Person>    <Name>张三</Name>    <Age>22</Age>    <Books>      <Book>        <ISBN>123</ISBN>        <Title>测试书</Title>      </Book>    </Books>  </Person></ArrayOfPerson>
以上要说明两点:
  1. xmlSerializerNamespaces是xml序列化的前缀或补充说明,一般会带命名空间等附带信息。如果不想要就可以
    xmlSerializerNamespaces.Add("", "");
  2. xml序列化设置大部分都可以通过XmlWriterSettings来设置的,具体有哪些设置

 

 名称说明
技术分享Async获取或设置指示是否可对特定 XmlWriter 实例使用异步 XmlWriter 方法的值。
技术分享CheckCharacters获取或设置指示的值编写 XML 是否应检查确保文档中的所有字符符合 W3C XML 1.0 推荐标准“2.2 个字符”一节。
技术分享CloseOutput获取或设置一个值,该值指示在调用 Close 方法时,XmlWriter 是否还应该关闭基础流或TextWriter。
技术分享ConformanceLevel获取或设置 XML 编写检查输出 XML 的遵循级别。
技术分享DoNotEscapeUriAttributes获取或设置指示 XmlWriter 是否转义 URI 属性的值。
技术分享Encoding获取或设置要使用的文本编码的类型。
技术分享Indent获取或设置一个值,该值指示是否缩进元素。
技术分享IndentChars获取或设置缩进时要使用的字符串。 当 Indent 属性设置为 true 时使用此设置。
技术分享NamespaceHandling获取或设置一个值,该值指示在编写 XML 内容时,XmlWriter 是否应移除重复的命名空间声明。 编写器的默认行为是输出编写器的命名空间解析程序中出现的所有命名空间声明。
技术分享NewLineChars获取或设置要用于分行符的字符串。
技术分享NewLineHandling获取或设置一个值,该值指示是否将输出中的分行符正常化。
技术分享NewLineOnAttributes获取或设置一个值,该值指示是否将属性写入新行。
技术分享OmitXmlDeclaration获取或设置一个指示是否忽略 XML 声明的值。
技术分享OutputMethod获取用于序列化 XmlWriter 输出的方法。
技术分享WriteEndDocumentOnClose获取或设置指示调用 Close 方法时,XmlWriter 是否会向所有未关闭的元素标记添加关闭标记的值。3.吃饭打算

   

    二、Deserialize序列化

          

public static T ToXmlTarget<T>(string gogalPath)        {            var xmlSerializer = new XmlSerializer(typeof(T));            using (var xmlStream = new FileStream(gogalPath, FileMode.Open))            {                var xmlReader = new XmlTextReader(xmlStream);                //ignore namespace                xmlReader.Namespaces = false;                var target = (T)xmlSerializer.Deserialize(xmlReader);                return target;            }        }

 

这里当我们碰到带有默认命名空间的xml,有时候会解析错误,因此我们通过xmlReader.Namespaces = false来设置了忽略他的命名空间。

接下来一篇博客,我们将重点讨论XML的Namespaces的作用。

 



Xml序列化和反序列化