• XML文件序列化和反序列化的相关内容


    问题缘由:

    XML反序列化出错,XML 文档(2, 2)中有错误,不应有 <configuration xmlns=''>

    解决方法:

    其实这个是很简单的,因为一般来说都是XML文档书写错误的问题!

    只要把你想反序列化的对象,再序列化为XML文档。之后再对比之前出错的XML文档对比,就知道错误在哪了!

    1 private void SerializeObject(string Xmlname)
    2         {
    3             XmlSerializer ser = new XmlSerializer(typeof(对象类型));
    4             
    5             TextWriter writer = new StreamWriter(Xmlname);
    6             ser.Serialize(writer, 对象);//要序列化的对象
    7             writer.Close();
    8         }
    View Code

    调用以上方法,可以把一个对象序列化XML文档(Xmlname:包含路径和Xml文件名)

    以上摘自:http://www.cnblogs.com/louyu/archive/2011/01/06/1929038.html

    顺手更新了下,见代码:

     1         /// <summary>
     2         /// 序列化成XML文件
     3         /// </summary>
     4         /// <typeparam name="T"></typeparam>
     5         /// <param name="path">XML文件位置</param>
     6         private static void SerializeXml<T>(string path) where T : new()
     7         {
     8             T t = new T();
     9             var ser = new XmlSerializer(typeof(T));
    10             TextWriter writer = new StreamWriter(path);
    11             ser.Serialize(writer, t);//要序列化的对象
    12             writer.Close();
    13         }

     问题深入:

     根据上面的方法序列化实体对象,得到的为一个简答的XML文件。但是如果我的XML文件相对略复杂,有多个配置组。 如果只是简单的反序列化,则也会报上面的错误。

    经过研究,发现了XML序列化和反序列化的一些规则。一个比较好的资料:http://www.cnblogs.com/johnsmith/archive/2012/12/03/2799795.html,在代码的备注里解释的比较详细。

    我的解决方法:

    反序列化的方法:

            /// <summary>
            /// 反序列化
            /// </summary>
            /// <param name="type">对象类型</param>
            /// <param name="filename">文件路径</param>
            /// <returns></returns>
            public static object XmlDeserialize(Type type, string filename)
            {
                FileStream fs = null;
                try
                {
                    fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    XmlSerializer serializer = new XmlSerializer(type);
                    return serializer.Deserialize(fs);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
            }
        }
    
    //调用:
    var obj = (List<类>)XmlDeserialize(typeof(List<类>), path);

    XML文件:

    <?xml version="1.0" ?>
    <ArrayOf类 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <>
        <URI>127.0.0.1:61616</URI>
        <TopicName>testTopic</TopicName>
        <ClientId>testClient</ClientId>
        <MessageType>IBytesMessage</MessageType>
        <UserName>admin</UserName>
        <Password>admin</Password>
      </>
     <类>
      ........
     </类>
    </ArrayOf类>
    <!-这里面的类就是指的要反序列化的类的名字,要保持一致。这是多个实体类,所以上层必须要用”ArrayOf类“来说明,必须要保持一致!->

    类的定义:

        /// <summary>
        /// 实体类
        /// </summary>
        [XmlRootAttribute("xml", IsNullable = false)]//必须有这个声明,从xml开始为root
        public class 类名字
        {
        …… ……
      }

    以上是我的解决方法。

    在文章http://www.cnblogs.com/johnsmith/archive/2012/12/03/2799795.html有更详细的解释。

  • 相关阅读:
    nacos配置文件优先级
    springboot配置文件优先级(由高到低)
    设计模式七大设计原则
    docker安装mycat并实现mysql读写分离和分库分表
    docker部署mysql主从复制
    ideaui中java抬头
    数据定时备份
    docker容器安装vim
    JMeter的安装
    VUE项目中同时使用API代理与MockJs
  • 原文地址:https://www.cnblogs.com/SzeCheng/p/4707184.html
Copyright © 2020-2023  润新知