C# XML与对象序列化和反序列化故事

使用场景:
1.在WebService服务定义基于SOAP协议的接口,返回XMLNode对象,XML字符串等
2.文件上传,需要解析xml文件里面的内容

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleAppTest
{
public class Program
{
static void Main(string[] args)
{
ChildrenTest ct = new ChildrenTest()
{
ChildernName = "xiaoming",
Age = 20,
};
PersonTest p = new PersonTest()
{
Id = 25,
Name = "liwei",
Childrens = ct,
CustomerList = new List<CustomerInfo>(),
};
p.CustomerList.Add(new CustomerInfo() { OrderId = "1222", Result = "Success" });
p.CustomerList.Add(new CustomerInfo() { OrderId = "1222", Result = "5562iik" });
//返回序列化之后的xml字符串
string xmlStr =XMLTool.XMLSerialize(p); 
//对象序列化xml字符串返回结果如下图: 


//xml字符串反序列化为对象
var pt = XMLTool.XmlDeserialize<PersonTest>(xmlStr);
xml反序列为对象结果如下图:
XmlDocument document = new XmlDocument(); document.LoadXml(xmlStr); //把xmldocument文档的所有节点和值克隆给xmlNode XmlNode personXmlNode = document.CloneNode(true); //把xmlNode对象反序列化为指定的对象 var person = XMLTool.XmlNodeDeserialize<PersonTest>(personXmlNode);
xmlNode对象反序列化为指定的对象返回结果如下图:
Console.ReadKey(); } //复杂的对象,如果不需要使用到别名的话,无需声明XmlRoot,XmlElement,XmlType这些标识 [XmlRoot("PersonInfo")] public class PersonTest { public int Id { get; set; } public string Name { get; set; } //声明xml节点标识 [XmlElement("PersonChildren")] public ChildrenTest Childrens { get; set; } public List<CustomerInfo> CustomerList { get; set; } } public class ChildrenTest { public string ChildernName { get; set; } public int Age { get; set; } } //用户信息 [XmlType(TypeName ="Customers")] public class CustomerInfo { public string Result { get; set; } public string OrderId { get; set; } } }

 

using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleAppTest
{
//对象与XML互转工具
public class XMLTool
{
//对象序列化为xml字符串
public static string XMLSerialize<T>(T entity)
{
StringBuilder buffer = new StringBuilder();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (TextWriter writer = new StringWriter(buffer))
{
xmlSerializer.Serialize(writer, entity, null);
}
return buffer.ToString();
}

//xml字符串反序列化为字符串
public static T XmlDeserialize<T>(string xmlString)
{
T myObject = default;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xmlString))
{
myObject = (T)serializer.Deserialize(reader);
}
return myObject;
}

//xmlnode反序列化为指定的对象
public static T XmlNodeDeserialize<T>(XmlNode xmlNode)
{
T myObject = default;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlNode))
{
myObject = (T)serializer.Deserialize(xmlNodeReader);
}
return myObject;
}
}
posted @ 2020-08-10 00:34  David威  阅读(192)  评论(0)    收藏  举报