博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML序列化与反序列化
阅读量:7085 次
发布时间:2019-06-28

本文共 3388 字,大约阅读时间需要 11 分钟。

一、概述

最近在使用第三方服务接口,要求请求输入和响应输出报文都是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

转载于:https://www.cnblogs.com/cdblh/p/cdblh.html

你可能感兴趣的文章
[转]Console命令详解,让调试js代码变得更简单
查看>>
bootstrap精简教程
查看>>
堆是堆,栈归栈
查看>>
语法面试等题目汇总
查看>>
你写的Try...Catch真的有必要么?
查看>>
4安德鲁斯.2.2在系统,具有系统权限的应用程序无法读取或写入SD卡
查看>>
【转】14.5.6 禁止和激活中断线
查看>>
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor...
查看>>
Android开发:使用ViewDragHelper实现抽屉拉伸效果
查看>>
CSS的position设置
查看>>
mysql实战优化之五: 更新/插入优化 sql优化
查看>>
Uber即将进驻扬州啦,车主火热招募中!
查看>>
缓存一致性协议
查看>>
JVM Input Arguments Lookup (JMX)(转)
查看>>
我持续推动Rust语言支持Windows XP系统
查看>>
Http状态码说明
查看>>
浏览器缓存相关http头
查看>>
Autofac.Integration.Owin
查看>>
李洪强经典面试题43
查看>>
NGINX反向代理
查看>>