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.mzph.cn/news/598342.shtml

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

相关文章

服务注册中心

服务注册中心 注册中心与CAP理论介绍 1.注册中心 服务注册中心是微服务架构中的一个关键组件&#xff0c;它的主要作用是管理服务实例的注册、维护和发现。 是一个中心化的组件来分散的微服务实例的位置和状态。 注册中心有三种角色构成&#xff1a; 服务提供者&#xff1a…

SSM框架注解大全

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;❤️ ❤️ ❤️ 文章码字不易&#xff0c;如果喜欢可以关注我哦&#xff01; ​如果本篇内容对你有所启发&#xff0c;欢迎访问我的个人博客了解更多内容&#xff1a;链接地址 SSM框架注解大全 三大框架注解…

跨境电商竞品分析:洞察市场,赢得先机的关键策略

在全球化日益加速的今天&#xff0c;跨境电商已经成为了企业拓展市场、提高销售额的重要手段。然而&#xff0c;跨境电商市场的竞争也日趋激烈&#xff0c;如何在众多竞争对手中脱颖而出&#xff0c;成为每个企业都面临的挑战&#xff1b;想要做到这点&#xff0c;了解竞品情况…

Apache Doris (六十一): Spark Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Spark Doris Connector…

【Python】开始你的Python之旅(Anaconda、Pycharm、Jupyter)

Python工具准备 下载安装AnacondaPycharmJupyter Notebook 启动使用AnacondaPycharmJupyter Notebook 引言&#xff1a; 信息时代&#xff0c;计算机引领。人工智能&#xff0c;Python是基础。信息时代学习好Python乃是在人工智能时代的立足之本。 本文&#xff1a; 做好Pyth…

开发者必备的 Github 加速工具(截至2024年01月)

开始闲聊前&#xff0c;我要感谢大神小青龍总结的博文&#xff1a;作为程序员不得不知道的几款Github加速神器&#xff0c;给我们介绍了常用&#xff08;较为合规&#x1f604;&#xff09;的加速方法。毕竟 github 是开发者绕不过的宝库。 背景 我用 Github 将近12年&#x…

初步认识架构分层

一般初创软件&#xff0c;为快速上线&#xff0c;几乎不考虑分层。但随业务越发复杂&#xff0c;就会导致逻辑复杂、模块相互依赖、代码扩展性差等各种问题。 架构分层迫在眉睫。 1 什么是架构分层? 软件工程中常见的设计方式&#xff0c;将整体系统拆分成N个层次&#xff0c;…

3D空间漫游技术的日趋成熟,让博物馆数字化大放异彩!

随着科技的飞速发展&#xff0c;互联网已经成为人们生活中不可或缺的一部分。在这个数字化时代&#xff0c;博物馆也紧跟时代潮流&#xff0c;将传统的实体博物馆与现代科技相结合&#xff0c;诞生了一种全新的博物馆形式——3D线上博物馆。这种新型博物馆凭借其独特的魅力&…

SemCms外贸网站商城系统 SQL注入漏洞复现(CVE-2023-50563)

0x01 产品简介 SemCms是国内团队打造的专门针对外贸网站的开源CMS,主要用于外贸企业,兼容IE,Firefox等主流浏览器。建设商城性质的外贸网站,多语言(小语种)网站。 0x02 漏洞概述 SemCms外贸网站商城系统SEMCMS_Function.php 中的 AID 参数存在SQL注入漏洞,未经身份认…

数据库:基础SQL知识+SQL实验2

&#xff08;1&#xff09;基础知识&#xff1a; 1.JOIN&#xff08;连接&#xff09;&#xff1a; 连接操作用于根据指定的条件将两个或多个表中的数据行合并在一起。JOIN 可以根据不同的条件和方式执行&#xff0c;包括等值连接、不等值连接等。 &#xff08;1&#xff09…

自制Java镜像发布到dockerhub公网使用

文章目录 问题现象解决制作Java镜像发布使用 问题现象 书接上回&#xff0c;上周处理了一个docker问题&#xff0c;写了篇博客&#xff1a;自定义docker镜像&#xff0c;ubuntu安装命令并导出我们使用谷歌的jib插件打包&#xff0c;详情可以参考这篇文章&#xff1a;Spring Bo…

联想M7400加粉后如何清零

联想M7400黑白激光多功能打印一体机加粉后清零方法&#xff1a; 吴中函 加粉后&#xff0c;确保硒鼓已经被正确安装并且机器已经通电。 1、打开前盖&#xff0c;以便进行后续的操作。 2、按下“清除/返回”键&#xff0c;这会触发一个屏幕提示&#xff1a;提示内容为“更换…

VM安装虚拟机及初始化操作

一、VM下载及暗转 虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;在实体计算机中能够完成的工作在虚拟机中都能够实现。VMware 是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在单一的桌面上同时运行不同的…

python毕设选题 - flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

463岛屿周长

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…

自动驾驶HWP的功能定义

一、功能定义 高速路自动驾驶功能HWP是指在一般畅通高速公路或城市快速路上驾驶员可以放开双手双脚&#xff0c;同时注意力可在较长时间内从驾驶环境中转移&#xff0c;做一些诸如看手机、接电话、看风景等活动&#xff0c;该系统最低工作速度为60kph。 如上两种不同环境和速度…

力扣题:字符串变换-1.5

力扣题-1.5 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;482. 密钥格式化 解题思想&#xff1a;首先先将破折号去除,并将所有字母转换为大写,然后计算第一组的长度,进行结果字符串的拼接,如果第一组的长度为0,则需要删除开头的’-符号 class S…

互联网加竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

BUUCTF crypto做题记录(5)新手向

一、传统知识古典密码 加上一个数&#xff0c;就有点移位加密的味道&#xff0c;很有可能就是凯撒加密 辛卯28&#xff0c;癸巳30&#xff0c;丙戌23&#xff0c;辛未8&#xff0c;庚辰17&#xff0c;癸酉10&#xff0c;己卯16&#xff0c;癸巳30 加1之后&#xff0c;28变29&a…

详解编码与调制

编码与调制是现代通信领域的重要概念。在信息传输过程中&#xff0c;编码和调制起着至关重要的作用&#xff0c;它们帮助将数字信号转化为模拟信号&#xff0c;从而实现高效、可靠的数据传输。本文将从编码和调制的基本概念、常见的编码和调制技术以及其在通信领域的应用等方面…