主要参考资料:
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>
<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>
<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>
</Class1>
这样的XML,可以用List<string>
public class Class1
{
[XmlElement("Model")]
public List<string> Model;
}
6. 性能
可以参考这篇
相比之下,用binary的DataContractSerializer性能最好
掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。