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带BOM
                if (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;
        }
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报 1. 保证Shell安全 ​ 自从2006年年底PowerShell发布以来&#xff0c;微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候&#xff0c;**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体&#xff0c…

3D Gaussian Splatting复现

最近3D Gaussian Splatting很火&#xff0c;网上有很多复现过程&#xff0c;大部分都是在Windows上的。Linux上配置环境会方便简单一点&#xff0c;这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译&#xff0c;建议看这个up主的视频配置&#xff0c;讲解的很细…

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

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

el-autocomplete远程搜索使用及el-upload上传多个文件流给后端,详情接口返回的是文件地址,前端将文件地址转成文件流,回传文件流给后端

最近遇到一个项目,里面有2个需求我觉得挺常见的,第一个需求是一个表单里,当用户在输入名称后,前端调接口发请求获取到关联名称的企业名称,并展示,然后当用户选中企业后,前端调接口获取选中企业的具体信息,并填充到表单里;第二个需求是,表单里有个上传图片的功能,前端…

异常、反射、注解知识点

1. Java 中的异常 是 Java 提供的一种处理程序中错误的机制。 当发生异常时&#xff0c;JVM 会将异常封装成一个异常对象抛出。此对象用来描述异常信息。 当 JVM 遇到程序异常就会自动停止。 2. 异常分类 Throwable&#xff1a;是 Java 异常的根类&#xff0c;Error 和 Exc…

macOS跨进程通信: XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

JAVA版鸿鹄云商B2B2C:解析多商家入驻直播带货商城系统的实现与应用

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

Java大数据hadoop2.9.2搭建伪分布式yarn资源管理器

1、修改配置文件 cd /usr/local/hadoop/etc/hadoop cp ./mapred-site.xml.template ./mapred-site.xml vi mapred-site.xml <configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> &l…

盲盒、一番赏小程序搭建,打开线上盲盒市场

近几年&#xff0c;我国潮玩市场发展非常迅速&#xff0c;在互联网的影响下&#xff0c;盲盒更是迅速走红网络&#xff0c;深受年轻人的喜欢&#xff0c;各大社交平台上关于盲盒的讨论度也是层出不穷。 一番赏与盲盒的机制都是差不多的&#xff0c;盲盒是在包装一样的盒子中放…

华为 1+X《网络系统建设与运维(初级)》 认证实验上机模拟试题

华为 1X《网络系统建设与运维&#xff08;初级&#xff09;》认证实验上机模拟试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案 三、考试正文3.1考试内容3.1.1任务 1&#xff1a;设备连接3.1.2任务 2&#xff1a;设备命名3…

2024年教资笔试报名开始啦,快看看今年有啥新变化?

2024年教资笔试报名开始啦&#xff0c;网上报名1月12号-1月15号&#xff0c; 网上审核时间&#xff1a;1月12号14&#xff1a;00-1月16号17&#xff1a;00 网上缴费&#xff1a;截止1月17号24&#xff1a;00 准考证打印&#xff1a;3月4-9号 考试时间&#xff1a;3月9号 成…

echarts实现点击不同的柱子实现类目的不同名字

实现效果如下图: 首先实现echarts堆叠柱状图数据为0的不占用x轴空间 option {tooltip: {trigger: axis,axisPointer: {type: shadow},},legend: {},grid: {left: 3%,right: 4%,bottom: 3%,containLabel: true},xAxis: [{type: category,position: bottom,data: [园区内, 园区…

【大数据】分布式协调系统 Zookeeper

分布式协调系统 Zookeeper 1.Zookeeper 的特点2.Zookeeper 的数据结构3.Zookeeper 的应用场景3.1 统一命名服务3.2 统一配置管理3.3 统一集群管理3.4 服务器动态上下线3.5 软负载均衡 Zookeeper 是 Apache 开源的一个顶级项目&#xff0c;目的是为分布式应用提供协调服务&#…

【C++期末编程题题库】代码+详解18道

适合期末复习c看&#xff0c;或者刚入门c的小白看&#xff0c;有的题会补充知识点&#xff0c;期末复习题的代码一般比较简单&#xff0c;所以语法上没那么严谨。本文所有题目要求全在代码块的最上面。 目录 1、设计复数类 2、设计Computer类 3、实现相加的函数模板 4、圆类…

基于Java SSM框架实现新闻推送系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现新闻推送系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…

Python 快速合并PDF表格转换输出CSV文件

单位的刷脸考勤机后台系统做得比较差&#xff0c;只能导出每个部门的出勤统计表pdf&#xff0c;格式如下&#xff1a; 近期领导要看所有部门的考勤数据&#xff0c;于是动手快速写了个合并pdf并输出csv文件的脚本。 安装模块 pypdf2&#xff0c;pdfplumber&#xff0c;前者用…

年底了,准备跳槽的可以看看...

前两天跟朋友感慨&#xff0c;今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经1月了&#xff0c;具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出…

企业该如何选择好的跨境数据传输平台

跨境数据传输平台是一种可以帮助企业在不同国家和地区之间安全传输数据的工具。它可以通过对数据进行加密、脱敏、压缩等处理&#xff0c;确保数据在传输过程中的安全性和完整性。同时&#xff0c;它还可以根据不同的合规要求&#xff0c;对数据进行分类、分级、备份等处理&…

Prometheus实战篇:Prometheus监控redis

准备环境 docker-compose安装redis docker-compose.yaml version: 3 services:redis:image:redis:5container_name: rediscommand: redis-server --requirepass 123456 --maxmemory 512mbrestart: alwaysvolumes:- /data/redis/data: /dataport:- "6379:6379"dock…