代码改变世界

XML序列化和反序列化(C#)

2013-12-05 18:41  taozsay  阅读(172)  评论(0)    收藏  举报
XML序列化是把强类型的类转化为XML,用于存储和传输。
特征:
1)只会序列化public的属性和字段
2)不包含类型信息
3)构造函数不能有参数
4)ReadOnly的属性是不会被序列化的
1. 通用静态类
在这里我用了一个public的static方法来处理序列化和反序列化:
  public static class ExtXMLSerialization
    {
        public static void SerializeToXml<T>(T obj, string fileName)
        {
            XmlSerializer ser = new XmlSerializer( typeof(T));
            FileStream fileStream = new FileStream(fileName, 
FileMode.OpenOrCreate);
            ser.Serialize(fileStream, obj);
            fileStream.Close();
        }
 
        public static T DeserializeFromXml<T>(string xml)
        {
            T result;
            XmlSerializer ser = new XmlSerializer( typeof(T));
            using (TextReader tr = new StringReader(xml))
            {
                result = (T)ser.Deserialize(tr);
            }
            return result;
        }
    }
之后的函数就调用这个方法来写范例代码了。
 
2. 基本方法
首先先要添加引用:
using System.Xml.Serialization;
using System.IO;
然后来看一个最简单的范例:
 class Program
    {
        static void Main(string[] args)
        {
            Class1 a = new Class1();
            a.Property1 = 1;
            a.Property2 = "aaa";
            ExtXMLSerialization.SerializeToXml<Class1 >(a, "C:\\1.xml");
 
            Console.Read();
        }
    }
 
    public class Class1
    {
        public int Property1{get;set;}
 
        public string Property2{get;set;}
        
    }
2. List
对于Generic的List,需要增加一个XmlElement
我们来增加一个类:
 public class Class1List
    {
        [ XmlElement("Class1" )]
        public List <Class1> MyList
        {
            get;
            set;
        }
 
        public Class1List()
        {
            MyList = new List <Class1>();
        }
    }
然后序列化这个类:
         static void Main(string[] args)
        {
            Class1 a = new Class1();
            a.Property1 = 1;
            a.Property2 = "aaa";
            Class1 b = new Class1();
            b.Property1 = 2;
            b.Property2 = "bbb";
            Class1List list = new Class1List();
            list.MyList.Add(a);
            list.MyList.Add(b);
            ExtXMLSerialization.SerializeToXml<Class1List >(list, 
"C:\\1.xml");
 
            Console.Read();
        }
由于Class1List这个类通过Class1这个子类的tag来解析,需要我们用XmlElement关键字
来指引。
除了XmlElement之外,还有XmlAttribute(表示Attribute),XmlIgnore(表忽视),X
mlRoot(表根节点)