首页 > 学院 > 开发设计 > 正文

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

2019-11-14 14:13:28
字体:
来源:转载
供稿:网友

问题缘由:

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.VEVb.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.VEVb.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 类名字    {
    &hellip;… ……
  }

以上是我的解决方法。

 

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表