C# 进行用(反)序列化方法实现xml与对象进行互相转换
在开发过程中我们可能会进行xml字符传与指定对象之间进行互相转换。用XmlSerializer对象可以把C#对象转换成xml字符串,当然也可以把xml字符串反序为指定的对象。我们用到以下的类方法进行操作
public class XmlHelper { /// <summary> /// 把对象转换成xml /// </summary> /// <param name="o"></param> /// <returns></returns> public static string serialize(object o) { var xml = ""; if (o == null) { return xml; } return serialize(o, o.GetType()); } /// <summary> /// 把对象转换成xml /// </summary> /// <param name="o"></param> /// <param name="type">指定对象类型</param> /// <returns></returns> public static string serialize(object o, Type type) { var xml = ""; if (o == null) { return xml; } //序列化对象 XmlSerializer serializer = new XmlSerializer(type); // 输出 Stream stream = new MemoryStream(); serializer.Serialize(stream, o); stream.Position = 0; StreamReader sr = new StreamReader(stream); xml = sr.ReadToEnd(); sr.Dispose(); sr.Close(); stream.Dispose(); stream.Close(); return 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("DocumentElement")] public class DocumentElement { //[XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable [XmlElement("DataTable")] //DataTable平行出现,不出现data public List<MyDataTable> data { get; set; } } [XmlRoot("DataTable")]//在xml文本需要DataTable为节点名,但DataTable又是C#关键字的时候 public class MyDataTable { [XmlElement(IsNullable = true)] public string oper { get; set; } [XmlElement(IsNullable = true)] public string gcode { get; set; } [XmlElement(IsNullable = true)] public string charge_code { get; set; } [XmlElement(IsNullable = true)] public string gname { get; set; } [XmlElement(IsNullable = true)] public string gname1 { get; set; } [XmlElement(IsNullable = true)] public string spn { get; set; } [XmlElement(IsNullable = true)] public string produrceid { get; set; } [XmlElement(IsNullable = true)] public string produrce { get; set; } [XmlElement(IsNullable = true)] public string unit { get; set; } [XmlElement(IsNullable = true)] public string caseunit { get; set; } [XmlElement(IsNullable = true)] public string pack { get; set; } [XmlElement(IsNullable = true)] public string zjm { get; set; } [XmlElement(IsNullable = true)] public string status { get; set; } public decimal price { get; set; } public decimal price1 { get; set; } [XmlElement(IsNullable=true)] public string zbh { get; set; } }
//测试序列化 var xml = ""; DocumentElement de = new DocumentElement(); var mdt = new MyDataTable(); mdt.caseunit = "箱"; mdt.charge_code = "X24538"; var mdt2 = new MyDataTable(); mdt2.caseunit = "箱"; mdt2.charge_code = "X24538"; de.data = new List<MyDataTable>(); de.data.Add(mdt); de.data.Add(mdt2); xml = XmlHelper.serialize(de); Console.WriteLine(xml);
,接下来可以测试xml字符串转换成类对象
先输入xml文件,XMLFile1.xml的内容:
<?xml version="1.0" encoding="utf-8" ?> <DocumentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <DataTable> <oper xsi:nil="true" /> <gcode xsi:nil="true" /> <charge_code>X24538</charge_code> <gname xsi:nil="true" /> <gname1 xsi:nil="true" /> <spn xsi:nil="true" /> <produrceid xsi:nil="true" /> <produrce xsi:nil="true" /> <unit xsi:nil="true" /> <caseunit>箱</caseunit> <pack xsi:nil="true" /> <zjm xsi:nil="true" /> <status xsi:nil="true" /> <price>0</price> <price1>0</price1> <zbh xsi:nil="true" /> </DataTable> <DataTable> <oper xsi:nil="true" /> <gcode xsi:nil="true" /> <charge_code>X24538</charge_code> <gname xsi:nil="true" /> <gname1 xsi:nil="true" /> <spn xsi:nil="true" /> <produrceid xsi:nil="true" /> <produrce xsi:nil="true" /> <unit xsi:nil="true" /> <caseunit>箱</caseunit> <pack xsi:nil="true" /> <zjm xsi:nil="true" /> <status xsi:nil="true" /> <price>0</price> <price1>0</price1> <zbh xsi:nil="true" /> </DataTable> </DocumentElement>
测试反序化:
var content = File.ReadAllText(Environment.CurrentDirectory + @"\XMLFile1.xml"); DocumentElement de = XmlHelper.deserialize(content, typeof(DocumentElement)) as DocumentElement; if (de != null) { var length = de.data.Count; //Console.WriteLine(de.data[length-1].charge_code); foreach (var item in de.data) { Console.WriteLine(item.charge_code); } }
关于参数的说明:
1. [XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable
默认情况下,集合数据在转换为xml字符串时,是父级DataTables包含子集DataTable的形式,如:<DataTables><DataTable>?</DataTable><DataTable>?</DataTable>...</DataTables>
1. [XmlElement("DataTable")] //DataTable平行出现,
当不需要显示父级DataTables这个字段时,用这种方式注释,DataTable平行出现,如:<DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable>...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构