亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

XML序列化與反序列化

Original 2016-11-09 15:58:51 793
abstract:一、概述最近在使用第三方服務(wù)接口,要求請求輸入和響應(yīng)輸出報(bào)文都是xml格式。因?yàn)槭敲嫦驅(qū)ο缶幊蹋哉{(diào)用接口之前已封裝好請求參數(shù)的對象實(shí)體;同理,接口返回結(jié)果已封裝成輸出結(jié)果的對象實(shí)體。整個(gè)過程要求類對象序列化成xml字符串,以及xml字符串反序列化成類對象。xml格式如下:<?xml version="1.0" encoding="gb2312"?&

一、概述

最近在使用第三方服務(wù)接口,要求請求輸入和響應(yīng)輸出報(bào)文都是xml格式。因?yàn)槭敲嫦驅(qū)ο缶幊?,所以調(diào)用接口之前已封裝好請求參數(shù)的對象實(shí)體;同理,接口返回結(jié)果已封裝成輸出結(jié)果的對象實(shí)體。整個(gè)過程要求類對象序列化成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>

注意以下內(nèi)容:

1.encoding="gbk2312",這個(gè)根據(jù)接口要求不同,可以在序列化時(shí)指定格式gbk2312 或 utf-8

2.xml必須有跟節(jié)點(diǎn),根節(jié)點(diǎn)名稱默認(rèn)是類對象的類名,也可以給類對象加上xmlroot特性指定其他別名

3.元素節(jié)點(diǎn)包括四部分:節(jié)點(diǎn)名稱(默認(rèn)類屬性名稱)、節(jié)點(diǎn)開/閉之間的內(nèi)容(默認(rèn)類屬性值)、節(jié)點(diǎn)屬性(在類屬性上加特性XmlAttribute)、節(jié)點(diǎn)屬性值(已有XmlAttribute特性的類屬性值)

4.節(jié)點(diǎn)又包含節(jié)點(diǎn),且節(jié)點(diǎn)內(nèi)容是相同元素的數(shù)組,數(shù)組對應(yīng)類對象的object[ ]類型

5.類對象屬性值為null值時(shí),不被序列化成xml節(jié)點(diǎn)元素,當(dāng)然也可以在序列化時(shí)設(shè)置強(qiáng)制要求被序列化;值為空時(shí)"",別序列化成自動閉合元素,如:<branch />

6.xml區(qū)分大小寫,類對象名稱、屬性名稱必須與xml元素大小寫保持一致

二、定義實(shí)體類對象

[XmlRoot(ElementName = "stream")] // 定義xml節(jié)點(diǎn)元素別名,非默認(rèn)的類名
    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] // 被包含的層級關(guān)系,即row里面包含row
        [XmlElement(ElementName = "row")] // 兄弟平級關(guān)系,即每個(gè)row是獨(dú)立并行
        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幫助類實(shí)現(xiàn)序列化與反序列化

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根節(jié)點(diǎn)名稱</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; // 自動格式化,縮進(jìn)對齊

                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add(string.Empty, string.Empty); // 去除默認(rèn)生成的命名空間: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;
            }
        }
    }


Release Notes

Popular Entries