### XML的序列化与反序列化详解 #### 一、引言 XML(Extensible Markup Language,可扩展标记语言)是一种被广泛使用的数据交换格式,它具有良好的结构化特性和跨平台兼容性。在.NET框架中,XML序列化提供了一种机制来将对象转换为XML文档或从XML文档中恢复对象的状态。这种技术在处理不同系统之间的数据交换时非常有用,尤其是在Web服务等场景下。 #### 二、XML序列化的概念 XML序列化是将对象的状态转化为XML格式的过程,以便于存储或在网络上传输。序列化可以实现对象的状态持久化,使得对象可以在不同的应用程序之间共享,也可以通过网络传输。.NET框架提供了`System.Xml.Serialization`命名空间下的类来支持这一功能,包括`XmlSerializer`类。 #### 三、XML序列化的步骤 1. **定义类**:定义需要序列化的类,并使用XML属性注解这些类。 2. **创建实例**:创建该类的一个实例并填充数据。 3. **序列化**:使用`XmlSerializer`类来将对象序列化成XML文档。 #### 四、示例代码解析 下面我们将对给定的代码进行详细解析: ```csharp public class People { [XmlAttribute("NAME")] public string Name { get; set; } [XmlAttribute("AGE")] public int Age { get; set; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { get; set; } [XmlElement("NUMBER")] public int Number { get; set; } } ``` 这段代码定义了两个类,`People`和继承自`People`的`Student`。`People`类有两个属性:`Name`和`Age`,分别用`XmlAttribute`特性标注;而`Student`类继承了`People`的所有属性,并新增了`Class`和`Number`两个属性,它们使用`XmlElement`特性标注。 接下来是序列化过程: ```csharp void Main(string[] args) { Student stu = new Student() { Age = 10, Class = "ClassOne", Name = "Tom", Number = 1 }; XmlSerializer ser = new XmlSerializer(typeof(Student)); ser.Serialize(File.Create("C:\\x.xml"), stu); } ``` 这里创建了一个`Student`对象,并设置了它的属性值。然后,使用`XmlSerializer`类的构造函数创建一个序列化器实例,指定序列化的类型为`Student`。最后调用`Serialize`方法将`stu`对象写入到名为“C:\\x.xml”的文件中。 #### 五、XML反序列化的概念 XML反序列化是将XML文档转换回对象状态的过程。这通常用于从存储中读取对象的状态或从网络接收对象。同样地,在.NET框架中,`XmlSerializer`类也支持反序列化操作。 #### 六、XML反序列化的步骤 1. **创建序列化器**:使用`XmlSerializer`类创建一个序列化器实例。 2. **加载XML文档**:从文件或流中读取XML文档。 3. **反序列化**:使用序列化器的`Deserialize`方法将XML文档转换为对象。 #### 七、XML序列化与反序列化的注意事项 - **命名空间**:确保所有相关的XML属性都正确地指定了命名空间。 - **性能考量**:XML序列化可能会导致较大的文件大小和较长的序列化/反序列化时间,因此在性能敏感的应用程序中应谨慎使用。 - **安全考虑**:对于不可信的输入,应限制XML文档的大小和复杂度,以防止潜在的安全风险,如DoS攻击。 #### 八、总结 本文详细介绍了XML序列化与反序列化的概念、步骤以及实际应用中的注意事项。通过理解这些基础知识和技术细节,开发人员能够更有效地利用.NET框架提供的工具来处理XML数据。在实际开发中,还需要根据具体需求选择合适的序列化策略,并注意性能和安全方面的考量。
<P>序列化对象</P>
<P> public class People<BR> {<BR> [XmlAttribute("NAME")]<BR> public string Name<BR> { set; get; }<BR> [XmlAttribute("AGE")]<BR> public int Age<BR> { set; get; }<BR> }<BR> [XmlRoot("Root")]<BR> public class Student : People<BR> {<BR> [XmlElement("CLASS")]<BR> public string Class<BR> { set; get; }<BR> [XmlElement("NUMBER")]<BR> public int Number<BR> { set; get; }<BR> }</P>
<P>void Main(string[] args)</P>
<P>{</P>
<P> Student stu = new Student()<BR> {<BR> Age = 10,<BR> Class = "Class One",<BR> Name = "Tom",<BR> Number = 1<BR> };<BR> XmlSerializer ser = new XmlSerializer(typeof(Student));<BR> ser.Serialize(File.Create("C:\\x.xml"), stu);</P>
<P>}</P>
<P>反序列化对象</P>
<P> XmlSerializer ser = new XmlSerializer(typeof(Student));<BR> Student stu = ser.Deserialize(File.OpenRead("C:\\x.xml")) as Student;</P>
<P>对象数组序列化</P>
<P> public class People<BR> {<BR> [XmlAttribute("NAME")]<BR> public string Name<BR> { set; get; }<BR> [XmlAttribute("AGE")]<BR> public int Age<BR> { set; get; }<BR> }<BR> [XmlRoot("Root")]<BR> public class Student : People<BR> {<BR> [XmlElement("CLASS")]<BR> public string Class<BR> { set; get; }<BR> [XmlElement("NUMBER")]<BR> public int Number<BR> { set; get; }<BR> }</P>
<P>void Main(string[] args)</P>
<P>{</P>
<P> List<Student> stuList = new List<Student>();<BR> stuList.Add(new Student() { Age = 10, Number = 1, Name = "Tom", Class = "Class One" });<BR> stuList.Add(new Student() { Age = 11, Number = 2, Name = "Jay", Class = "Class Two" });<BR> stuList.Add(new Student() { Age = 12, Number = 3, Name = "Pet", Class = "Class One" });<BR> stuList.Add(new Student() { Age = 13, Number = 4, Name = "May", Class = "Class Three" });<BR> stuList.Add(new Student() { Age = 14, Number = 5, Name = "Soy", Class = "Class Two" });<BR> XmlSerializer ser = new XmlSerializer(typeof(List<Student>));<BR> ser.Serialize(File.Create("C:\\x.xml"), stuList);</P>
<P>}</P>
<P>对象数组反序列</P>
<P> XmlSerializer ser = new XmlSerializer(typeof(List<Student>));<BR> List<Student> stuList = ser.Deserialize(File.OpenRead("C:\\x.xml")) as List<Student>;<BR> foreach (Student s in stuList)<BR> {<BR> MessageBox.Show(string.Format("{0} : {1} : {2} : {3}",<BR> s.Name, s.Age, s.Class, s.Number));<BR> }</P>
<P>序列化Dirctionary</P>
<P> public struct DirectionList<BR> {<BR> [XmlAttribute("Name")]<BR> public string Name;<BR> [XmlElement("Value")]<BR> public int Value;<BR> }</P>
<P>void Main(string[] args)</P>
<P>{</P>
<P> Dictionary<string, int> list = new Dictionary<string, int>();<BR> list.Add("1", 100);<BR> list.Add("2", 200);<BR> list.Add("3", 300);<BR> list.Add("4", 400);<BR> list.Add("5", 500);<BR> list.Add("6", 600);<BR> list.Add("7", 700);<BR> list.Add("8", 800);<BR> list.Add("9", 900);</P>
<P> List<DirectionList> dirList = new List<DirectionList>();<BR> foreach (var s in list)<BR> {<BR> dirList.Add(new DirectionList() { Name = s.Key, Value = s.Value });<BR> }<BR> XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>));<BR> ser.Serialize(File.Create("C:\\x.xml"), dirList);</P>
<P>}</P>
<P>这里还要讲一点,在XmlSerializer中,不支持Dirctionary<>类型的对象,所以在序列化这种最常见类型的时候,只能按照它的格式先创建一个可以别序列化的类型,这里我定义了一个结构体,当然你也可以定义成其他的类。将Dictionary<>中的数据依次放进结构体以后就可以放入流中了。</P>
<P>[XmlAttribute("Name")]意思是将这个字段作为xml的属性,属性名跟在“”中</P>
<P>[XmlElement("Value")]意思是将这个字段做为xml的元素。</P>
<P></P>
<P>反序列化Dirctionary</P>
<P><BR> XmlSerializer ser = new XmlSerializer(typeof(List<DirectionList>));<BR> List<DirectionList> dirList = ser.Deserialize(<BR> File.OpenRead("C:\\x.xml")) as List<DirectionList>;<BR> foreach (var v in dirList)<BR> {<BR> Console.WriteLine("{0} : {1}", v.Name, v.Value);<BR> }</P>
- 粉丝: 5
- 资源: 245
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 毕设和企业适用springboot社交应用平台类及虚拟人类交互系统源码+论文+视频.zip
- 毕设和企业适用springboot人力资源管理类及智能会议管理平台源码+论文+视频.zip
- 毕设和企业适用springboot商城类及城市智能运营平台源码+论文+视频.zip
- 毕设和企业适用springboot商城类及车联网管理平台源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及食品配送平台源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及视频监控系统源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及视频内容分发平台源码+论文+视频.zip
- 毕设和企业适用springboot社交应用平台类及云计算资源管理平台源码+论文+视频.zip
- 毕设和企业适用springboot社交应用平台类及用户反馈平台源码+论文+视频.zip
- 毕设和企业适用springboot社交应用平台类及用户数据分析平台源码+论文+视频.zip
- 毕设和企业适用springboot商城类及个性化推荐系统源码+论文+视频.zip
- 毕设和企业适用springboot商城类及电子产品维修平台源码+论文+视频.zip
- 毕设和企业适用springboot商城类及风险控制平台源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及数据存储平台源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及数据智能化平台源码+论文+视频.zip
- 毕设和企业适用springboot社交互动平台类及投票平台源码+论文+视频.zip