XML的序列化和反序列化

在工作中经常会碰到XML序列化和反序列化的问题,下面这个例子简单的介绍了C#中如何进行这两种操作。接下来我会先将XML文件中的内容转化成string类型,然后反序列化成一个对象,最后再将该对象序列化输出到屏幕上。

1.首先先新建一个XML文件方便读取XML数据:

<?xml version="1.0" encoding="utf-8" ?>
<Info>
  <User id="1" name="张三">
    <Age>10</Age>
    <Sex>男</Sex>
    <Job>机械工程师</Job>
  </User>
  <User id="2" name="李四">
    <Age>20</Age>
    <Sex>女</Sex>
    <Job>软件工程师</Job>
  </User>
  <Station id="1">
    <Name>测试机器</Name>
    <DateTime>2018-1-1 00:00:00</DateTime>
  </Station>
  <Server id="2">
    <Name>服务器</Name>
    <IP>127.0.0.1</IP>
  </Server>
</Info>
2.新建文件添加对应的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace UnityConsole
{
    public class UserInfo
    {
        [XmlAttribute("id")]
        public string ID { get; set; }
        [XmlAttribute("name")]  //属性
        public string Name { get; set; }
        [XmlElement(ElementName = "Age")]
        public int Age { get; set; }
        [XmlElement(ElementName = "Sex")]
        public string Sex { get; set; }
        [XmlElement(ElementName = "Job")]
        public string Job { get; set; }
        [XmlIgnore]
        public int Height { get; set; }  //不进行序列化
    }
    public class StationInfo
    {
        [XmlAttribute("id")]
        public string ID { get; set; }
        [XmlElement(ElementName = "Name")]
        public string Name { get; set; }
        [XmlElement(ElementName = "DateTime")]
        public string DateTime { get; set; }
    }
    public class ServerInfo
    {
        [XmlAttribute("id")]
        public string ID { get; set; }
        [XmlElement(ElementName = "Name")]
        public string Name { get; set; }
        [XmlElement(ElementName = "IP")]
        public string IP { get; set; }
    }

    [Serializable]
    [XmlRoot(ElementName = "Info")]
    public class SerializeInfo
    {
        [XmlElement(ElementName = "User")]
        public List<UserInfo> userInfos = new List<UserInfo>();
        [XmlElement(ElementName = "Station")]
        public List<StationInfo> stationInfos = new List<StationInfo>();
        [XmlElement(ElementName = "Server")]
        public List<ServerInfo> serverInfos = new List<ServerInfo>();
    }
}

注意:

[XmlElement(ElementName = "XXX")]表明对应的节点名
[XmlAttribute("XXX")]表示对应的属性

3.序列化和反序列化:
public class XMLSerialize
{
	public object Deserialize(string str)
	{
		StringReader sr = new StringReader(str);
		XmlSerializer serializer = new XmlSerializer(typeof(SerializeInfo));
		return serializer.Deserialize(sr);
	}

	public string Serialize(object obj)
	{
		StringWriter sw = new StringWriter();
		//XML命名空间
		XmlSerializerNamespaces xmlnp = new XmlSerializerNamespaces();
		xmlnp.Add("", "");
		XmlSerializer serializer = new XmlSerializer(typeof(SerializeInfo));
		serializer.Serialize(sw, obj, xmlnp);
		sw.Close();
		return sw.ToString();
	}

	public string Version()
	{
		return "XMLSerialize";
	}
}
4.在主函数中调用:
string path = System.AppDomain.CurrentDomain.BaseDirectory;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(path + "XMLFile.xml");
XMLSerialize xMLSerialize = new XMLSerialize();
SerializeInfo serializeInfo = xMLSerialize.Deserialize(xmlDocument.OuterXml) as SerializeInfo;
Console.WriteLine("反序列化:\n{0}", xMLSerialize.Serialize(serializeInfo));
Console.ReadLine();
注意:在使用XML序列化和反序列化的时候一定要加上
using System.Xml;
using System.Xml.Serialization;
输出结果:

猜你喜欢

转载自blog.csdn.net/a519736285/article/details/80800434