C# xml序列化和反序列化

问题

有的项目使用webservice返回结果是xml,需要进行xml序列化和反序列化

xml序列化相关特性

C#中,XML序列化相关的特性主要包括:

  • XmlIgnore:这个特性可以用来指示序列化过程忽略一个属性或一个字段。当使用XmlIgnore特性时,被标记的属性或字段将不会被序列化到XML。
  • XmlAttribute:这个特性可以用来指示序列化过程将一个属性或字段作为一个XML属性而不是元素。
  • XmlElement:这个特性可以用来指定序列化过程将一个属性或字段作为一个XML元素。
  • XmlText:这个特性可以用来指定序列化过程将一个属性或字段的值作为XML文本节点。
  • XmlType:这个特性可以用来指定序列化过程为类或结构体生成一个特定的XML类型名称。
  • XmlRoot:这个特性可以用来指定序列化过程的根元素名称和可选的命名空间。
  • XmlAccessType:这个特性可以用来指定属性或字段的访问类型,以控制它们在序列化过程中是否可读或可写。这些特性可以在类、属性或字段上使用,以控制C#对象如何被序列化为XML。

案例代码

XmlHelper.cs

using System.Text;
using System.Xml;
using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// xml帮助类/// </summary>public class XmlHelper{/// <summary>/// 对象转化为xml字符串,如果有参数为null则不进行序列化/// </summary>/// <param name="obj"></param>/// <param name="isFormat">是否进行格式化</param>/// <param name="isNeedHeader">是否需要xml请求头</param>/// <returns></returns>public static string ObjectToXmlString(object obj, bool isNeedHeader = false, bool isFormat = false){try{XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());XmlWriterSettings settings = new XmlWriterSettings();settings.Encoding = new UTF8Encoding(false);//utf-8不带BOM //Encoding.UTF8;utf-8带BOMif (isFormat){settings.Indent = true;settings.IndentChars = "    ";settings.NewLineChars = "\r\n";}if (!isNeedHeader){settings.OmitXmlDeclaration = true;  // 不生成声明头}using (var memoryStream = new MemoryStream())using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, settings)){// 强制指定命名空间,覆盖默认的命名空间XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();namespaces.Add(string.Empty, string.Empty);xmlSerializer.Serialize(xmlWriter, obj, namespaces);var xmlString = Encoding.UTF8.GetString(memoryStream.ToArray());return xmlString;};}catch{return string.Empty;}}/// <summary>/// 将XML数据反序列化为对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="xmlData"></param>/// <returns></returns>public static T? XmlStringToObject<T>(string xmlData) where T : class{// 创建XmlSerializer实例  XmlSerializer serializer = new XmlSerializer(typeof(T));// 使用XmlReader读取XML并反序列化为Person对象  using (StringReader reader = new StringReader(xmlData)){XmlReader xmlReader = XmlReader.Create(reader);T? result = serializer.Deserialize(xmlReader) as T;return result;}}}
}

FriendModel

using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 好朋友/// </summary>[XmlRoot("FRIEND")]public class FriendModel{/// <summary>/// 姓名/// </summary>[XmlAttribute("NAME")]public string? Name { get; set; }/// <summary>/// 性别/// </summary>[XmlAttribute("SEX")]public string? Sex { get; set; }}
}

ChildModel

using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 孩子模型/// </summary>[XmlRoot("CHILD")]public class ChildModel{/// <summary>/// 姓名/// </summary>[XmlElement("NAME")]public string? Name { get; set; }/// <summary>/// 出生日期/// </summary>[XmlElement("BIRTHDAY")]public string? BirthDay { get; set; }/// <summary>/// 好朋友有多个/// </summary>[XmlElement("FRIEND")]public List<FriendModel>? Friends { get; set; }}
}

ParentModel

using System.Xml.Serialization;namespace XmlStu02
{/// <summary>/// 父类模型/// </summary>[XmlRoot("PARENT")]public class ParentModel{/// <summary>/// 姓名/// </summary>[XmlElement("NAME")]public string? Name { get; set; }/// <summary>/// 出生日期/// </summary>[XmlElement("BIRTHDAY")]public string? BirthDay { get; set; }/// <summary>/// 孩子,有多个/// </summary>[XmlElement("CHILDREN")]public List<ChildModel>? Children { get; set; }}
}

测试

using System.Text.Json;namespace XmlStu02
{internal class Program{/// <summary>/// 程序入口方法/// </summary>/// <param name="args"></param>static void Main(string[] args){var friend = new FriendModel();friend.Name = "小明";friend.Sex = "男";Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine(XmlHelper.ObjectToXmlString(friend, true, true));var child = new ChildModel();child.Name = "大孩子";child.BirthDay = null;child.Friends = new List<FriendModel>() {friend,new FriendModel(){Name="小红",Sex="女"}};Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine(XmlHelper.ObjectToXmlString(child, true, true));var parnent = new ParentModel();parnent.Name = "父亲";parnent.BirthDay = "1970-10-01";parnent.Children = new List<ChildModel>(){child,new ChildModel(){Name="小孩子",BirthDay="1995-02-18"}};Console.ForegroundColor = ConsoleColor.Blue;var parentXml = XmlHelper.ObjectToXmlString(parnent, true, true);Console.WriteLine(parentXml);var xmlParent = XmlHelper.XmlStringToObject<ParentModel>(parentXml);if (xmlParent != null){Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("xml反序列化成功");Console.ForegroundColor = ConsoleColor.Magenta;var jsonConfig = new JsonSerializerOptions{WriteIndented = true, // 可选,仅用于格式化输出  Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping};Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(xmlParent, jsonConfig));}Console.ForegroundColor = ConsoleColor.White;}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++日期类的实现

前言&#xff1a;在类和对象比较熟悉的情况下&#xff0c;我们我们就可以开始制作日期表了&#xff0c;实现日期类所包含的知识点有构造函数&#xff0c;析构函数&#xff0c;函数重载&#xff0c;拷贝构造函数&#xff0c;运算符重载&#xff0c;const成员函数 1.日期类的加减…

【数据结构】——期末复习题库(6)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

线程池的shutdown和shutdownnow的区别

1、先说结论 shutdown ---- 不再接收新的任务&#xff0c;但是已经在执行中和队列中的任务会等待执行完成&#xff0c; 对workers中空闲的线程执行interrupt shutdownnow ---- 不再接收新的任务&#xff0c;清空队列的任务&#xff0c;对works中所有的线程执行interrupt&…

2024年您应该知道的 12个绝佳且免费的 AI 工具

2024年&#xff0c;人工智能的世界会继续让我们着迷。 这里收集了12 个免费的 AI 工具&#xff0c;其中大多数易于使用&#xff0c;还有一些复杂的。无论如何&#xff0c;AI 将会给我们的工作和生活带来巨大的改变&#xff0c;了解并掌握最适合自己的工作至关重要。 1、Adobe …

【springboot+vue项目(十一)】springboot整合EasyExcel

EasyExcel是阿里巴巴开源的一个Java库&#xff0c;用于操作Excel文件。它提供了简单易用的API&#xff0c;可以读取、写入和转换Excel文件&#xff0c;支持大量数据的导入和导出操作。 一、添加依赖&#xff08;版本3.2&#xff09; <!--easyexcel操作excel--> <depe…

BUG-由浏览器缩放引起PC端显示手机端视图

文章目录 来源解决 来源 启动Vue项目&#xff0c;用浏览器打开显示手机端视图&#xff0c;从vscode直接ctrl链接打开正常显示。 检查-未开启仿真&#xff0c;但仍显示错误。 解决 浏览器缩放问题。 修改为100%

宝宝洗衣机哪个牌子质量好?好用的小型洗衣机推荐

当婴儿的到来&#xff0c;确实会给家庭带来许多变化&#xff0c;就好比如对于宝宝相关衣物的清洗需求。对于新生儿及婴幼儿的衣服&#xff0c;一般都要给予特殊的照顾与清洗&#xff0c;以保证不含细菌及过敏原。尤其是刚刚出生的婴儿&#xff0c;这时候宝宝们的皮肤很是幼嫩。…

法二(命令行):YOLOv5打包.exe

0 准备工作 yolov5环境配置完毕安装pyinstaller&#xff0c;命令为 pip install pyinstallerps: 为了避免可能的错误&#xff0c;所有操作请在英文路径下进行。 1 修改detect_qt5.py或者相关文件 如果是使用我的检测界面的&#xff0c;应该是修改detect_qt5.py这个文件&#x…

全网最低价——组合预测模型全家桶

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

【AIGC科技展望】预测AIGC2025年的机会与挑战

2025年&#xff0c;AIGC的机会与挑战 在未来的五年里&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;将会成为一个越来越重要的领域。但是&#xff0c;伴随着机会而来的是挑战。在这篇文章中&#xff0c;我们将一起探讨AIGC的机会与挑战&#xff0c;并预测2025…

AI绘图模型不会写字的难题解决了

介绍 大家好&#xff0c;最近有个开源项目比较有意思&#xff0c;解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文&#xff1f; 数据集局限 Stable Diffusion的训练数据集以英文数据为主&#xff0c;没有大量包含其他语言文本的…