天天看點

化零為整WCF(9) - 序列化(DataContractSerializer, XmlSerializer, DataContractJsonSerializer

<a href="http://webabcd.blog.51cto.com/1787395/343999" target="_blank">[索引頁]</a>

化零為整WCF(9) - 序列化(DataContractSerializer, XmlSerializer, DataContractJsonSerializer, SoapFormatter, BinaryFormatter)

介紹

WCF(Windows Communication Foundation) - 序列化:本文分别以DataContractSerializer, XmlSerializer, DataContractJsonSerializer, SoapFormatter, BinaryFormatter為例。

示例

1、服務

DataContractSerializerObject.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.Runtime.Serialization; 

namespace WCF.ServiceLib.Serialization 

        /// &lt;summary&gt; 

        /// 用于示範DataContract序列化的實體類 

        /// &lt;/summary&gt; 

        // Namespace - 資料契約的命名空間 

        [DataContract(Namespace = "http://webabcd.cnblogs.com/")] 

        public class DataContractSerializerObject 

        { 

                // Name - 資料成員的名稱 

                // Order - 資料成員的序列化和反序列化的順序 

                [DataMember(Name = "UniqueID", Order = 0)] 

                public Guid ID { get; set; } 

                [DataMember(Order = 1)] 

                public string Name { get; set; } 

                [DataMember(Order = 2)] 

                public int Age { get; set; } 

                [DataMember(Order = 3)] 

                public DateTime Time { get; set; } 

        } 

}

XmlSerializerObject.cs

using System.Xml.Serialization; 

        /// 用于示範XML序列化的實體類 

        // Namespace - XML 根元素的命名空間 

        [XmlRoot(Namespace = "http://webabcd.cnblogs.com/")] 

        public class XmlSerializerObject 

                // ElementName - 生成的 XML 元素的名稱 

                // Order - 序列化和反序列化的順序 

                [XmlElement(ElementName = "UniqueID", Order = 0)] 

                [XmlElement(Order = 1)] 

                [XmlElement(Order = 2)] 

                [XmlElement(Order = 3)] 

SoapFormatterObject.cs

        /// 用于示範Soap序列化的實體類 

        [Serializable] 

        public class SoapFormatterOjbect 

BinaryFormatterObject.cs

        /// 用于示範Binary序列化的實體類 

        public class BinaryFormatterObject 

DataContractJsonSerializerObject.cs

        /// 用于示範JSON序列化的實體類 

        public class DataContractJsonSerializerObject 

2、示範

Sample.aspx.cs

using System.Collections; 

using System.Configuration; 

using System.Data; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.HtmlControls; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Xml.Linq; 

using System.IO; 

using API = WCF.ServiceLib.Serialization; 

public partial class Serialization_Sample : System.Web.UI.Page 

        protected void Page_Load(object sender, EventArgs e) 

                // 示範DataContractSerializer的序列化和反序列化 

                ShowDataContractSerializer(); 

                // 示範XmlSerializer的序列化和反序列化 

                ShowXmlSerializer(); 

                // 示範SoapFormatter的序列化和反序列化 

                ShowSoapFormatter(); 

                // 示範BinaryFormatter的序列化和反序列化 

                ShowBinaryFormatter(); 

                // 示範DataContractJsonSerializer的序列化和反序列化 

                ShowDataContractJsonSerializer(); 

        /// 示範DataContractSerializer的序列化和反序列化 

        void ShowDataContractSerializer() 

                var dataContractSerializerObject = new API.DataContractSerializerObject { ID = Guid.NewGuid(), Name = "DataContractSerializer", Age = 28, Time = DateTime.Now }; 

                var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(API.DataContractSerializerObject)); 

                // 序列化 

                var ms = new MemoryStream(); 

                serializer.WriteObject(ms, dataContractSerializerObject); 

                ms.Position = 0; 

                var sr = new StreamReader(ms); 

                var str = sr.ReadToEnd(); 

                txtDataContractSerializer.Text = str; 

                // 反序列化 

                var buffer = System.Text.Encoding.UTF8.GetBytes(str); 

                var ms2 = new MemoryStream(buffer); 

                var dataContractSerializerObject2 = serializer.ReadObject(ms2) as API.DataContractSerializerObject; 

                lblDataContractSerializer.Text = dataContractSerializerObject2.Name; 

        /// 示範XmlSerializer的序列化和反序列化 

        void ShowXmlSerializer() 

                var xmlSerializerObject = new API.XmlSerializerObject { ID = Guid.NewGuid(), Name = "XmlSerializer", Age = 28, Time = DateTime.Now }; 

                var serializer = new System.Xml.Serialization.XmlSerializer(typeof(API.XmlSerializerObject)); 

                serializer.Serialize(ms, xmlSerializerObject); 

                txtXmlSerializer.Text = str; 

                var xmlSerializerObject2 = serializer.Deserialize(ms2) as API.XmlSerializerObject; 

                lblXmlSerializer.Text = xmlSerializerObject2.Name; 

        /// 示範SoapFormatter的序列化和反序列化 

        void ShowSoapFormatter() 

                var soapFormatterOjbect = new API.SoapFormatterOjbect { ID = Guid.NewGuid(), Name = "ShowSoapFormatter", Age = 28, Time = DateTime.Now }; 

                var formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); 

                formatter.Serialize(ms, soapFormatterOjbect); 

                var str = System.Text.Encoding.UTF8.GetString(ms.GetBuffer()); 

                txtSoapFormatter.Text = str; 

                var soapFormatterOjbect2 = formatter.Deserialize(ms2) as API.SoapFormatterOjbect; 

                lblSoapFormatter.Text = soapFormatterOjbect2.Name; 

        /// 示範BinaryFormatter的序列化和反序列化 

        void ShowBinaryFormatter() 

                var binaryFormatterObject = new API.BinaryFormatterObject { ID = Guid.NewGuid(), Name = "BinaryFormatter", Age = 28, Time = DateTime.Now }; 

                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

                formatter.Serialize(ms, binaryFormatterObject); 

                var buffer = ms.GetBuffer(); 

                var str = System.Text.Encoding.UTF8.GetString(buffer); 

                txtBinaryFormatter.Text = str; 

                var binaryFormatterObject2 = formatter.Deserialize(ms2) as API.BinaryFormatterObject; 

                lblBinaryFormatter.Text = binaryFormatterObject2.Name; 

        /// 示範DataContractJsonSerializer的序列化和反序列化 

        void ShowDataContractJsonSerializer() 

                var dataContractJsonSerializerObject = new API.DataContractJsonSerializerObject { ID = Guid.NewGuid(), Name = "DataContractJsonSerializer", Age = 28, Time = DateTime.Now }; 

                var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(API.DataContractJsonSerializerObject)); 

                serializer.WriteObject(ms, dataContractJsonSerializerObject); 

                txtDataContractJsonSerializer.Text = str; 

                var dataContractJsonSerializerObject2 = serializer.ReadObject(ms2) as API.DataContractJsonSerializerObject; 

                lblDataContractJsonSerializer.Text = dataContractJsonSerializerObject2.Name; 

運作結果:

DataContractSerializer 

&lt;DataContractSerializerObject xmlns="http://webabcd.cnblogs.com/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"&gt;&lt;UniqueID&gt;86148742-ef08-4d78-acab-ce393ea8b885&lt;/UniqueID&gt;&lt;Name&gt;DataContractSerializer&lt;/Name&gt;&lt;Age&gt;28&lt;/Age&gt;&lt;Time&gt;2008-04-24T09:06:23.875+08:00&lt;/Time&gt;&lt;/DataContractSerializerObject&gt;

XmlSerializer

&lt;?xml version="1.0"?&gt; &lt;XmlSerializerObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webabcd.cnblogs.com/"&gt; &lt;UniqueID&gt;15efa47f-9532-4e91-8c00-3097ea976106&lt;/UniqueID&gt; &lt;Name&gt;XmlSerializer&lt;/Name&gt; &lt;Age&gt;28&lt;/Age&gt; &lt;Time&gt;2008-04-24T09:06:24.109375+08:00&lt;/Time&gt; &lt;/XmlSerializerObject&gt;

ShowSoapFormatter 

&lt;SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt; &lt;SOAP-ENV:Body&gt; &lt;a1:SoapFormatterOjbect id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/WCF.ServiceLib.Serialization/WCF.ServiceLib%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"&gt; &lt;_x003C_ID_x003E_k__BackingField&gt; &lt;_a&gt;1444890659&lt;/_a&gt; &lt;_b&gt;-27168&lt;/_b&gt; &lt;_c&gt;20156&lt;/_c&gt; &lt;_d&gt;131&lt;/_d&gt; &lt;_e&gt;247&lt;/_e&gt; &lt;_f&gt;146&lt;/_f&gt; &lt;_g&gt;29&lt;/_g&gt; &lt;_h&gt;18&lt;/_h&gt; &lt;_i&gt;59&lt;/_i&gt; &lt;_j&gt;58&lt;/_j&gt; &lt;_k&gt;189&lt;/_k&gt; &lt;/_x003C_ID_x003E_k__BackingField&gt; &lt;_x003C_Name_x003E_k__BackingField id="ref-3"&gt;ShowSoapFormatter&lt;/_x003C_Name_x003E_k__BackingField&gt; &lt;_x003C_Age_x003E_k__BackingField&gt;28&lt;/_x003C_Age_x003E_k__BackingField&gt; &lt;_x003C_Time_x003E_k__BackingField&gt;2008-04-24T09:06:24.5000000+08:00&lt;/_x003C_Time_x003E_k__BackingField&gt; &lt;/a1:SoapFormatterOjbect&gt; &lt;/SOAP-ENV:Body&gt; &lt;/SOAP-ENV:Envelope&gt;

BinaryFormatter

���� EWCF.ServiceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null2WCF.ServiceLib.Serialization.BinaryFormatterObject&lt;ID&gt;k__BackingField&lt;Name&gt;k__BackingField&lt;Age&gt;k__BackingField&lt;Time&gt;k__BackingField System.Guid ���� System.Guid _a_b_c_d_e_f_g_h_i_j_k��y�u��I����]F�BinaryFormatter�U�tʈ

DataContractJsonSerializer 

{"UniqueID":"f4173d7d-9555-4dcb-8db7-62b85315d3f1","Name":"DataContractJsonSerializer","Age":28,"Time":"\/Date(1208999184531+0800)\/"}

OK

<a href="http://down.51cto.com/data/100781" target="_blank">[源碼下載下傳]</a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344147,如需轉載請自行聯系原作者