在工作中经常会碰到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")]表示对应的属性
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;
输出结果: |