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的作用。

 



你可能感兴趣的:(反序列化)