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有更详细的解释。