概述
XML序列化和反序列化是C#的常用技术,实现的方式有很多种,序列化即将对象转化为便于传输的数据格式, 常见的方法有:二进制,字节数组,json字符串,xml字符串等。今天主要通过XmlSerializer类的Serialize和Deserialize方法实现.
标注
如果使用XmlSerializer类实现序列化,不需要用[Serializable]属性标记对象的类型。如果用DataContractSerializer序列化对象,则需要标注[Serializable]或[DataContract]。.
需要序列化的类型前标注 [XmlRoot("Name")],表示根节点;
[XmlType(TypeName = "Name")] 节点
[XmlElement("Name")] 元素
[XmlAttribute("Name")] 属性
[XmlArray] 声明集合
详见:微软官网:https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/attributes-that-control-xml-serialization

Mark:
1. 私有属性不会被序列化;
2. 标注为[XmlIgnore]的共有属性也不会被序列化;
3. 枚举类型的属性序列化之前需要赋值
实例
using Caliburn.Micro.Hello.Helper;using Caliburn.Micro.Hello.Models;using System;using System.Collections.Generic;using System.IO;using System.Text;namespace Caliburn.Micro.Hello.ViewModels{public class XmlSerializerViewModel : Screen, IViewModel{private StringBuilder stringBuilder = new StringBuilder();public string DisplayInfo { get; set; }public XmlSerializerViewModel(){DisplayName = "XmlSerializer";xmlFile();SerializeToXml();DeserializeXml();DisplayInfo = stringBuilder.ToString();}public void xmlFile(){XmlFile xmlFile = new XmlFile();xmlFile.CreateXmlFile("ReviewParams", "maxValue", "30");}public void SerializeToXml(){//测试序列化var xml = "";StudentList de = new StudentList();var person1 = new Student();person1.Name = "郭德纲";person1.Age = 58;person1.Sex = "男";var person2 = new Student();person2.Name = "洪金宝";person2.Age = 72;person2.Sex = "男";de.data = new List<Student>();de.data.Add(person1);de.data.Add(person2);xml = XmlHelper.serialize(de);stringBuilder.AppendLine(xml);//XmlHelper.SerializeToXml(de);XmlHelper.SerializeToXml(new DocumentDic());}public void DeserializeXml(){var content = File.ReadAllText(Environment.CurrentDirectory + @"\myxml.xml");DocumentDic dee = XmlHelper.deserialize(content, typeof(DocumentDic)) as DocumentDic;if (dee != null){foreach (var item in dee.dataDic.Values){stringBuilder.AppendLine(item.Name);}}}}}
运行结果:

这里要注意的是 xtw.Formatting = Formatting.Indented;//可实现换行显示;Dictionary本身不支持序列化,所以需要重写为可序列化的SerializableDictionary;
SerializeToXml:
public static void SerializeToXml(object o){var type = o.GetType();if (o == null){return;}//序列化对象XmlSerializer serializer = new XmlSerializer(type);using (XmlTextWriter xtw = new XmlTextWriter("myxml.xml", Encoding.UTF8)) //用XmlTextWriter 创建一个XML文件{xtw.Formatting = Formatting.Indented;//可实现换行显示serializer.Serialize(xtw, o);};}
反序化xml为对象:
/// <summary>/// 反序化xml为对象/// </summary>/// <param name="xml"></param>/// <param name="type"></param>/// <returns></returns>public static object deserialize(string xml, Type type){try{using (StringReader sr = new StringReader(xml)){XmlSerializer serializer = new XmlSerializer(type);return serializer.Deserialize(sr);}}catch (Exception e){return null;}}
数据模型:
//对象定义[XmlRoot("RecipeData")]//[DataContract(Name = "RecipeData", Namespace = "DataContracts")][Serializable]public class DocumentDic{public DocumentDic(){dataDic = new SerializableDictionary<string, Student>();var person = new Student();person.Name = "韦小宝";person.Age = 65;person.Sex = "男";dataDic.Add("明星", person);}[XmlElement("DataTable")] //DataTable平行出现,不出现data//[XmlIgnore]//[DataMember(Name = "dataDic")]public SerializableDictionary<string, Student> dataDic { get; set; }}//对象定义[XmlRoot("StudentList")]public class StudentList{//[XmlArray("Students"), XmlArrayItem("Student")][XmlElement("Students")]public List<Student> data { get; set; }}[XmlRoot("Student")]public class Student{[XmlElement("Name")]public string Name { get; set; }[XmlElement("Age")]public int Age { get; set; }[XmlElement("Sex")]public string Sex { get; set; }}
此外还可以用DataContractSerializer,
DataContractSerializer 与 XMLSerializer的区别:
① 需要序列化对象的所有公共和私有字段和属性,可以使用 DataContractSerializer 而不要使用 XML 序列化。
②DataContractSerializer 的性能优于 Xmlserializer。DataContractSerializer 序列化所有标记为 [DataMember] 属性的成员,即使成员标记为私有。一个类不同时使用[Serializable]和[DataContract]标签。
源码下载
链接:https://pan.baidu.com/s/1y1PqmsmHj-roDWv9Pou0LQ
提取码:6666
本文参考:如有侵权,请联系小编删除!
1. 【C# XML 序列化】开篇 - https://www.cnblogs.com/cdaniu/p/16093919.html
2. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结 - https://zhuanlan.zhihu.com/p/487914400