XML序列化与反序列化

序列化与反序列化、Xml文件的读写 1.准备工作:找关系,可以把三个标签看成Book类的三个对象,id,name,author,price可以看成Book类对象的属性,文本内容就是对应的属性值。我们现在要在桌面下创建一个xml文件,内容是如下图片的信息:开头标签表示声明,有标签,它有三个子标签,每个又有三个子标签。//获得根标签所有的子节点,(之所以说节点,是节点可以包含元素节点,文本节点,属性节点,所以我不嫩职介所子标签,但是这里它只有子标签) 阅读详情

一、概述

最近在使用第三方服务接口,要求请求输入和响应输出报文都是xml格式。因为是面向对象编程,所以调用接口之前已封装好请求参数的对象实体;同理,接口返回结果已封装成输出结果的对象实体。整个过程要求类对象序列化成xml字符串,以及xml字符串反序列化成类对象。

xml格式如下:

<?xml version="1.0" encoding="gb2312"?>
<stream>
<action>DLBREGSN</action>
<userName>CHH</userName>
<accGenType /><calInterestFlag />
<branch />
<list name="">
<row>
<contactName>nameCHH</contactName>
<contactPhone>phone123</contactPhone>
<mailAddress>mail@</mailAddress>
</row>
</list>
</stream>

注意以下内容:

1.encoding="gbk2312",这个根据接口要求不同,可以在序列化时指定格式gbk2312 或 utf-8

2.xml必须有跟节点,根节点名称默认是类对象的类名,也可以给类对象加上xmlroot特性指定其他别名

3.元素节点包括四部分:节点名称(默认类属性名称)、节点开/闭之间的内容(默认类属性值)、节点属性(在类属性上加特性XmlAttribute)、节点属性值(已有XmlAttribute特性的类属性值)

4.节点又包含节点,且节点内容是相同元素的数组,数组对应类对象的object[ ]类型

5.类对象属性值为null值时,不被序列化成xml节点元素,当然也可以在序列化时设置强制要求被序列化;值为空时"",别序列化成自动闭合元素,如:<branch />

6.xml区分大小写,类对象名称、属性名称必须与xml元素大小写保持一致

二、定义实体类对象

[XmlRoot(ElementName = "stream")] // 定义xml节点元素别名,非默认的类名
    public class Stream
    {
        public string status { get; set; }

        public string statusText { get; set; }

        public string subAccNo { get; set; }

        public string subAccNm { get; set; }

        public string hostNo { get; set; }

        [XmlElement(ElementName = "list")]
        public DataList List { get; set; }

    }

    [XmlRoot(ElementName = "list")]
    public class DataList
    {
        [XmlAttribute]// name是list元素的属性,而不是list的子元素
        public string name { get; set; }

        //[XmlArray] // 被包含的层级关系,即row里面包含row
        [XmlElement(ElementName = "row")] // 兄弟平级关系,即每个row是独立并行
        public DataRow[] Row { get; set; }

    }

    [XmlRoot(ElementName = "row")]
    public class DataRow
    {
        public string contactName { get; set; }
        public string contactPhone { get; set; }
        public string mailAddress { get; set; }
    }


三、XML帮助类实现序列化与反序列化

public class XmlHelper
    {
        /// <summary>
        /// 将xml字符串反序列化对象
        /// </summary>
        /// <param name="type">对象类型</param>
        /// <param name="xml">xml字符串</param>
        /// <returns></returns>
        public static object Deserialize(Type type, string xml)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer xmlS = new XmlSerializer(type);
                    return xmlS.Deserialize(sr);
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// 对象序列化成xml字符串
        /// </summary>
        /// <param name="type">对象类型</param>
        /// <param name="obj">被序列化的对象</param>
        /// <param name="encodingName">xml编码格式:utf-8,gbk,gb2312</param>
        /// <param name="xmlRootName">xml根节点名称</param>
        /// <returns></returns>
        public static string Serializer(Type type, object obj,string encodingName="utf-8"
            , string xmlRootName = "")
        {

            XmlSerializer xmlS = string.IsNullOrWhiteSpace(xmlRootName)
                ? new XmlSerializer(type)
                : new XmlSerializer(type, new XmlRootAttribute(xmlRootName));
            
            try
            {
                using (MemoryStream Stream = new MemoryStream())
                {
                    XmlWriterSettings settings=new XmlWriterSettings();
                    settings.Encoding=Encoding.GetEncoding(encodingName);
                    settings.OmitXmlDeclaration=false; // 是否生成<?xml version="1.0" encoding="utf-8"?>                    
                    settings.WriteEndDocumentOnClose = true;
                    settings.Indent = true; // 自动格式化,缩进对齐

                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add(string.Empty, string.Empty); // 去除默认生成的命名空间:xmlns:xsd和xmlns:xsi

                    XmlWriter xWr=XmlWriter.Create(Stream,settings);                    
                    xmlS.Serialize(xWr, obj, ns);

                    Stream.Position = 0;
                    using (StreamReader sr = new StreamReader(Stream, Encoding.GetEncoding(encodingName)))
                    {
                        string str = sr.ReadToEnd();
                        return str;
                    }
                }
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }
    }


xmlhelper类基本能满足所有第三方接口要求的输入/输出xml字符格式。大家有任何疑问可以随时联系我QQ/微信:956915886

(unity)xml序列化和反序列化 (日常简单小笔记,欢迎提意见~) C#的xml序列化 类转成xml 类转成二进制 一、类转成xml的序列化和反序列化 例如:以下定义的一个需要转成xml的类(不继承于 MonoBehaviour )。 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Xml.S... 阅读详情

相关推荐

Qt--自定义数据结构(序列化与反序列化)

一、概念 序列化:将对象或数据结构转换为二进制序列 反序列化:二进制序列转换为对象或数据结构 序列化可以使对象或数据结构更方便地在网络上传输或者保存在本地文件中,反序列化可以快速地复原原有对象和数据结构,方便使用。 二、具体操作 Qt中提供了QDataStream类用于读写二进制文件,所以可以借助此类实现序列化和反序列化。 2.1、定义数据结构 #ifndef DATA_RECORD_H #define DATA_RECORD_H #include <QObject> #include &l

贝勒里恩的博客 9174

QT 之序列化反序列化

QT 数据读写

zzwwgg1984的博客 2675

通过序列化操作实现QT程序状态的本地持久化

在运行一些程序的时候最害怕的就是任务快结束的时候程序崩溃了或者电脑死机了,程序还得从头开始跑,这太让人崩溃了。为了解决这种问题,我们可以通过序列化操作将程序的状态持久化到本地,这样一来如果程序突然崩溃了,我们可以通过本地的状态文件将程序恢复到崩溃之前的状态,这样程序就不用从头开始跑了。很多网盘的断点续传功能,大概就是这个原理。...

yang1fei2的博客 2045

Qt扫盲-QDataStream 序列化和反序列化理论

序列化是将对象转换为字节流的过程,可以将对象持久化保存在磁盘或者通过网络传输。反序列化是将字节流转换为对象的过程,可以将保存或传输的对象重新恢复到内存中。数据持久化:将对象保存到磁盘中,实现数据的长期存储。例如,将用户的配置信息序列化为文件,以便在下次打开应用程序时可以重新加载。数据传输:通过网络传输对象,实现不同系统之间的数据交互。分布式计算。

洪源兄 5514

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3449

数学建模入门——数据预处理(全)

介绍了数据预处理的入门知识

n04j04h06的博客 4346

【XML】XML序列化与反序列化

XML的序列化与反序列化 问题:什么是序列化? 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 把对象的字节...

学海无涯苦作舟 7454

告别瞎猜!用通达信/同花顺这些资金流向函数,一眼看穿主力动向(附实战公式)

本文详细解析了通达信/同花顺资金流向函数的实战应用,帮助投资者精准识别主力动向。通过12个核心资金函数的组合逻辑,构建主力行为监控体系,避免未来函数陷阱,识别主力对倒行为,并提前捕捉异动。适合股票投资者提升自选股分析能力。

weixin_42522964的博客 1190

XML 反序列化

XML 反序列化成Model 1.方法: public static object DeserializeXml(Type type, string xml) { using (StringReader sr = new StringReader(xml)) { XmlSerializer desXml = new XmlSerializer(type); ...

PinkCoder 3248

谐振电路原理与应用场景全解析

本文全面解析了谐振电路的原理、类型及其核心应用。详细阐述了串联谐振与并联谐振的工作特性,并重点介绍了其在无线通信调谐、音频处理分频以及电力系统滤波与无功补偿等关键场景中的实际作用。通过公式推导与实例分析,帮助读者深入理解LC谐振的选频与能量交换机制。

t1u2v的博客 838

微信Dat文件转图片(文末含工具下载)

PC端微信dat图片转换为jpg格式

weixin_40704848的博客 8080

XML序列化和反序列化

介绍 本文讨论了XML格式的对象序列化以及将XML文件反序列化回对象。序列化是一个过程,通过该过程,对象的状态以某种串行数据格式转换,例如XML或二进制格式。另一方面,反序列化用于将数据的字节(例如XML或二进制数据)转换为对象类型。序列化是将对象转换为易于传输的形式的过程。例如,您可以使用客户端和服务器之间的HTTP序列化对象并通过Internet传输它。另一方面,反序列化从流中重建对象。XM...

向高手学习 1498

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

VB.NET反序列化XML

 序列化,是将对象状态转换为可保持或传输的格式的过程。 与序列化相反的是反序列化,它将流转换为对象。这两个过程结合起来,就可以存储和传输数据。这就是序列化的意义所在。 在VB.NET中转换、处理和生成XML文档时,需要用到一些XML专用名称空间中的类,这些名称空间包括: System.Xml    该名称空间提供了对各种XML标准(包括DTD、名称空间、DOM、XDR(XML

liuchuan__________的博客 5850

手把手教你用分立元件搭建自举电路:解决高端MOS驱动难题

本文详细介绍了如何用分立元件搭建自举电路,解决高端MOS驱动中的栅源极电压不足问题。通过面包板实验,逐步讲解二极管、电容等关键元件的选型与电路搭建,提供波形调试和常见问题排查方法,帮助工程师提升开关电源和电机驱动等应用的效率与可靠性。

weixin_30555125的博客 152

无监督学习与互信息

在机器学习中,获取大量高质量标注数据成本高昂。为解决此问题,无监督学习利用丰富的无标注数据成为研究重点。其中,互信息是衡量两个随机变量之间依赖关系的关键指标,能够捕捉非线性统计关联,非常适合处理非结构化数据。通过最大化神经网络中变量间的互信息,可以有效地从无标注数据中提取有用信息,提升模型在下游任务(如分类)的性能。互信息与熵密切相关,其值等于联合分布与边缘分布乘积间的KL散度,也可通过熵与条件熵的差值得出,具有对称性,并反映了已知一个变量后另一个变量不确定性的减少。

盼小辉丶的博客 3523

XML的序列化和反序列化

最近新项目一些数据文件都是XML文件,这样就涉及到对XML文件的测试。所以就抽时间把相关的知识整理归纳下。   什么是XML序列化与反序列化? XML序列化将对象的公共字段和属性值序列化为XML流,以便传输或存储。反序列化根据流重新构造对象。XmlSerializer 类使你得以控制如何将对象编码到 XML 中。   以下是段简单的XML序列化与反序列化代码:

wangyizhi58的专栏 852

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

xml序列化 java_XML序列化和反序列化

在谈XML序列化之前,我们先来说说序列化。为什么要做序列化和反序列化?.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。这就是序列化的意义所在...

weixin_42395426的博客 1224

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C#序列化反序列化读写XML文件

为了构建如下图所示的xml文件 在这个文件中CompanyConfig为该XML的根节点,它的里面由多个DepartmentConfig节点组成,在DepartmentConfig节点中又包括PersonInfo节点,PersonInfo中又包括姓名和职位。 下面首先我们要做的是创建与该XML相对应的对象,然后把对象转换为上述XML(序列化),或者把上述XML转换为对象(反序列化)。 ...

Mr.Sun 的博客 6491

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Jackson实现xml序列化和反序列化

Jackson实现xml序列化和反序列化 本文介绍Jackson 2.X中提供的xml序列化功能。仅介绍基本操作,不涉及复杂和自定义功能。 1. XmlMapper对象 XmlMapper是Jackson 2.x中提供我们实现xml序列化的主要类,因此首先需要创建其实例: XmlMapper mapper = new XmlMapper(); 想要maven依赖脚本为: <dependen...

neweastsun的专栏 1万+

c# 实现xml文件的序列化和反序列化

XML文件用途 xml问件是众多文件类型中的一种。xml最大的功能就是存储数据,它就像一个纯文本的数据库,可以跨平台、跨系统使用。 XML文件的序列化就是把对象转化成可以存储或传输的流状态。与之相对的反序列化即把流状态的数据读入对象中。 XML文件的结构是树状的<></>这样的一对括号代表了一对节点,<BookStore>bookStore</BookStore>,这样一对节点就代表了节点名是BookStore,内容是bookStore, 还可以为节点

clearlove77 4261

json与 xml的序列化与反序列化

序列化:将对象转换为 XML 格式,以便存储或传输。反序列化:从 XML 格式中提取数据,恢复为对象或数据结构。序列化和反序列化通常用于系统之间的数据交换,特别是在跨平台或不同编程语言之间互操作时非常有用。XML 是一种广泛使用的数据格式,因其结构化和自描述性而被许多系统支持。JSON(JavaScript Object Notation)和 XML(可扩展标记语言)都是常用的数据格式,用于序列化和反序列化对象。XML跨语言和跨平台支持数据体积XMLJSON。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 995
上一篇: B2B2C商城产品原型设计(Web版本)-陈辉辉-专题视频课程
下一篇: 网站使用微信登录接口,所踩的坑...
鸿花粉
博客等级 码龄20年 321粉丝 70原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿花粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值