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性能最好
 
掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。

你可能感兴趣的:(反序列化)