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

主要参考资料:

http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1

 
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;
        }
    }

 

最终会生成这么个xml:
<?xml version="1.0"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Property1>1</Property1>
  <Property2>aaa</Property2>
</Class1>
 
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关键字来指引。
结果如下:
<?xml version="1.0"?>
<Class1List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Class1>
    <Property1>1</Property1>
    <Property2>aaa</Property2>
  </Class1>
  <Class1>
    <Property1>2</Property1>
    <Property2>bbb</Property2>
  </Class1>
</Class1List>
除了XmlElement之外,还有XmlAttribute(表示Attribute),XmlIgnore(表忽视),XmlRoot(表根节点)
 
我现在工作项目中用到的基本都是JSON。。。
不过自己随便写写东西还是会用XML,毕竟可读性好一些。之前自己脑残竟然全部用XDocument手工来读写。。。于是最近重构了。
 
补充:
1. static的成员不会被序列化
 
2. 与Java Serializer之间的互相移植
 
3. 不能对interface类型
例如IModel
不然就会得到错误:
Cannot serialize member XXXX of type YYY because it is an interface.
 
4. 如果要对private的对象序列化,用DataContractSerializer
 
5. 如果要反序列化诸如:
<Class1>
     <Model>1</Model>
     <Model>2</Model>
</Class1>
这样的XML,可以用List<string>
public class Class1
{
[XmlElement("Model")]
public List<string> Model;
}
 
6. 性能
可以参考这篇
相比之下,用binary的DataContractSerializer性能最好
 
掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。
posted @ 2013-07-03 16:51  Dem  阅读(858)  评论(0编辑  收藏  举报