您的位置:首页 > 编程语言 > C#

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

2013-07-03 16:51 363 查看
主要参考资料:
http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1

http://www.codeproject.com/Articles/487571/XML-Serialization-and-Deserialization-Part-2

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之间的互相移植
http://woxserializer.sourceforge.net/

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. 性能
可以参考这篇
http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx
相比之下,用binary的DataContractSerializer性能最好

掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: