一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 深入理解:XML與對象的序列化與反序列化

深入理解:XML與對象的序列化與反序列化

2020-04-10 15:42PHP教程網 PHP教程

本篇文章是對XML與對象的序列化與反序列化進行了詳細的分析介紹,需要的朋友參考下

這篇文章主要講述XML與對象的序列化與反序列化。并且會附上一些簡單的序列化與反序列化方法,供大家使用。
假設我們在一個Web項目中有這樣兩個類

復制代碼 代碼如下:

public class Member
    {
      public string Num { get; set; }
      public string Name { get; set; }
    }
    public class Team
    {
       public  string Name;
       public  List<Member> Members { get; set; }
    }


假設我們需要把Team類的一個實例POST到一個URL,
當然,使用Form隱藏域提交就可以完成該功能。
如果該Team包括30條數據呢?
為了區分每個Member,我們得給參數的名字加上后綴。這就要一大串的隱藏域來完成:

復制代碼 代碼如下:

<!--使用Razor來演示-->
@model Team
<form id="submitForm" action="http://www.johnconnor.com/team" method="post">
<input type="hidden" name="TeamName" value="@Model.Name" />
<input type="hidden" name="MemberNum1" value="@Model.Members[0].Num" />
<input type="hidden" name="MemberName1" value="@Model.Members[0].Name" />
...
<!--省略28X2個input標簽-->
<input type="hidden" name="MemberNum30" value="@Model.Members[29].Num" />
<input type="hidden" name="MemberName30" value="@Model.Members[29].Name" />
</form>
<script type="text/javascript">
    document.getElementById("submitForm").submit();
</script>


還敢想象一下如果Team再復雜一些,嵌套再多一些的情況么?
呃,即使你愿意這么傳數據,對方看到一坨參數名就夠頭疼了。
我們都知道對象是不能在網絡中直接傳輸的,不過還有補救的辦法。
XML(Extensible Markup Language)可擴展標記語言,本身就被設計用來存儲數據,任何一個對象都可以用XML來描述。以Team類為例:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Development</Name>
  <Members>
    <Member>
      <Num>001</Num>
      <Name>Marry</Name>
    </Member>
    <Member>
      <Num>002</Num>
      <Name>John</Name>
    </Member>
  </Members>
</Team>


這樣一個XML文檔就表示了Team一個實例。
聰明的看官應該已經想到,XML是可以作為對象信息的載體在網絡中傳輸,因為它是文本形式的。
怎么進行XML文檔與對象的相互轉換呢?

XmlSerializer類就是干這個活的。
      命名空間:System.Xml.Serialization
     程序集:System.Xml(在 system.xml.dll 中)

現在這里展示了一個提供序列化與反序列化方法的EncodeHelper類。
Deserialize方法將XML字符串轉換為指定類型的對象;
Serialize方法則將對象轉換為XML字符串。

復制代碼 代碼如下:

/// <summary>
    /// 提供xml文檔序列化 反序列化
    /// </summary>
    public sealed class EncodeHelper
    {
        /// <summary>
        /// 反序列化XML字符串為指定類型
        /// </summary>
        public static object Deserialize(string Xml, Type ThisType)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(ThisType);
            object result;
            try
            {
                using (StringReader stringReader = new StringReader(Xml))
                {
                    result = xmlSerializer.Deserialize(stringReader);
                }
            }
            catch (Exception innerException)
            {
                bool flag = false;
                if (Xml != null)
                {
                    if (Xml.StartsWith(Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble())))
                    {
                        flag = true;
                    }
                }
                throw new ApplicationException(string.Format("Couldn't parse XML: '{0}'; Contains BOM: {1}; Type: {2}.",
                Xml, flag, ThisType.FullName), innerException);
            }
            return result;
        }
        /// <summary>
        /// 序列化object對象為XML字符串
        /// </summary>
        public static string Serialize(object ObjectToSerialize)
        {
            string result = null ;
            try
            {
            XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());

            using (MemoryStream memoryStream = new MemoryStream())
            {
                XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false));
                xmlTextWriter.Formatting = Formatting.Indented;
                xmlSerializer.Serialize(xmlTextWriter, ObjectToSerialize);
                xmlTextWriter.Flush();
                xmlTextWriter.Close();
                UTF8Encoding uTF8Encoding = new UTF8Encoding(false, true);
                result= uTF8Encoding.GetString(memoryStream.ToArray());
            }
            }
            catch (Exception innerException)
            {
                throw new ApplicationException("Couldn't Serialize Object:" + ObjectToSerialize.GetType().Name, innerException);
            }
            return result;
        }
    }


要使用這個類需要添加以下引用
using System;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

下面我們用一個控制臺程序來演示一下這個類是如何工作的。這里是程序的Main函數。

復制代碼 代碼如下:

static void Main(string[] args)
        {
            List<Member> Members = new List<Member>();
            Member member1 = new Member { Name = "Marry", Num = "001" };
            Member member2 = new Member { Name = "John", Num = "002" };
            Members.Add(member1);
            Members.Add(member2);
            Team team = new Team { Name = "Development", Members = Members };
            var xml =EncodeHelper.Serialize(team);//序列化
            Console.Write(xml);//打印序列化后的XML字符串
            Console.ReadLine();
            Team newTeam = EncodeHelper.Deserialize(xml, typeof(Team)) as Team;//反序列化時需要顯式的進行類型轉換
            Console.WriteLine("Team Name:"+newTeam.Name);//顯示反序列化后的newTeam對象
            foreach (var member in newTeam.Members)
            {
                Console.WriteLine("Member Num:" + member.Num);
                Console.WriteLine("Member Name:" + member.Name);
            }
            Console.ReadLine();
        }


在執行完Console.Write(xml)這行代碼后,就可以看到打印出來的XML文檔了。

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Development</Name>
  <Members>
    <Member>
      <Num>001</Num>
      <Name>Marry</Name>
    </Member>
    <Member>
      <Num>002</Num>
      <Name>John</Name>
    </Member>
  </Members>
</Team>


與我在文章開頭給出的例子是一模一樣的。
最終反序列化出來的newTeam對象打印出來是這樣的結果。
Team Name:Development
Member Num:001
Member Name:Marry
Member Num:002
Member Name:John

回到我們開頭的Web通信的例子,
利用XML序列化與反序列化來進行對象傳遞,我們只需要把需要傳遞的對象序列化為XML字符串,使用一個隱藏域進行form提交就可以搞定咯!
接收方再將接收到的XML字符串反序列化成預設的對象即可。前提是雙方必須約定序列化與反序列化的過程一致,且對象相同。

最后我們來看一下怎么利用一些特性來控制序列化與反序列化操作的過程。我們把開始的類改一下:

復制代碼 代碼如下:

public class Member
    {
        [XmlElement("Member_Num")]
        public string Num { get; set; }
        public string Name { get; set; }
    }
    [XmlRoot("Our_Team")]
    public class Team
    {
        [XmlIgnore]public string Name;
        public List<Member> Members { get; set; }
    }


然后我們再次執行剛才的控制臺程序,序列化結果變成了這樣:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Our_Team xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Members>
    <Member>
      <Member_Num>001</Member_Num>
      <Name>Marry</Name>
    </Member>
    <Member>
      <Member_Num>002</Member_Num>
      <Name>John</Name>
    </Member>
  </Members>
</Our_Team>


本來的根節點Team變成了Our_Team,Member的子節點Num變成了Member_Num,并且Team的Name子節點被忽略了。
可見特性XmlRoot可以控制根節點的顯示和操作過程,XmlElement則針對子節點。如果某些成員被標記XmlIgnore,則在序列化與反序列化過程中會被忽略。
這些特性的具體內容可以在MSDN查看,就不多講了。
有了這些知識,在網絡中傳遞對象數據應該已經難不倒各位看官了把。^_^

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: kkkk4444在线看片| 波多野结衣女老师 | 免费在线视频观看 | 被夫上司强迫中文 | 久久久久激情免费观看 | gogo人体模特啪啪季玥图片 | 甜蜜惩罚小说 | 久久精品视在线观看85 | 99久久精品6在线播放 | 第一次破苞h | 5566中文字幕亚洲精品 | 亚洲视频在线一区二区 | 国产情侣偷国语对白 | 国产精品日本亚洲777 | 美女脱得一二净无内裤全身的照片 | 99re这里只有精品视频 | 国产九九 | 日本艳鉧动漫1~6在线观看 | 免费xxxxx大片在线观看影视 | 恩爱夫妇交换小说 | 亚洲欧美精品一区二区 | 久久精品国产色蜜蜜麻豆国语版 | 天天爱天天做天天爽天天躁 | 国产一级大片免费看 | 美女艹b| 亚洲国产婷婷俺也色综合 | 日本-区二区三区免费精品 日本破处 | 99国产热 | 和老外3p爽粗大免费视频 | 欧美丝袜foot job | 好吊色网站 | yjsp妖精视频在线观看免费 | 114级毛片免费观看 1024亚洲天堂 | 无限资源在线观看播放 | 日韩国产成人资源精品视频 | 海派甜心完整版在线观看 | 国产免费一区二区三区免费视频 | 国产成人影院在线观看 | 鸥美毛片| 亚洲精品国产乱码AV在线观看 | 男人躁女人过程 |