代码改变世界

【原创】序列化/反序列化

2012-06-11 17:37  杨新华  阅读(646)  评论(3编辑  收藏  举报

关于序列化与反序列化的知识,对于现在的C#程序员来说并不是什么新的东西了。今天我就大概说一下比较常用而序列化与序列化的通用方法。

一:概念

将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。[引用百科]

二:目的

持久化存储、按值封送

三:特点

A:数据传输快。因为它可以把一个对象序列化成字节流,流在两台服务器之间传输是比较快的。

B:易于保存。序列化的结果体积比较小,例如:序列化成二进制格式存储的。可以保存成一个文件,或是存储到数据库

C:安全性高,你可以把一个明文的对象,进行序列化。再用自己的加密算法进行加密。即使别人看到了,也无法知道其中的内容

D:跨平台:XML序列化是可以跨平台的。因为序列化的XML是标准的XML文档

四:我们开始代码吧

(1)Binary序列化器

命名空间:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

 1    /// <summary>
 2         /// 序列化
 3         /// </summary>
 4         /// <typeparam name="T">要序列化的对象类型</typeparam>
 5         /// <param name="file">序列化出来的文件</param>
 6         /// <param name="tObj">要序列化的对象</param>
 7         /// <returns></returns>
 8         public static string Serialize<T>(T obj)
 9         {
10             using (MemoryStream stream = new MemoryStream())
11             {
12                 IFormatter formatter = new BinaryFormatter();
13                 formatter.Serialize(stream, obj);
14                 return stream.ToString();
15             }
16         }
17         /// <summary>
18         /// 反序列化
19         /// </summary>
20         /// <typeparam name="T">反序列化出来对象类型</typeparam>
21         /// <param name="file">要反序列化的文件</param>
22         /// <returns></returns>
23        public static T Deserialize<T>(string objContent)
24         {
25             T obj = default(T);
26             using (MemoryStream stream = new MemoryStream(System.Text.Encoding.Default.GetBytes(objContent)))
27             {
28                 IFormatter formatter = new BinaryFormatter();
29                 obj = (T)formatter.Deserialize(stream);
30                 return obj;
31 
32             }
33         }

(2)XML序列化器
命名空间

using System.IO;

using System.Xml;
using System.Xml.Serialization;

 1       /// <summary>
 2        /// 序列化
 3        /// </summary>
 4        /// <typeparam name="T">要序列化的对象类型</typeparam>
 5        /// <param name="file">序列化出来的文件</param>
 6        /// <param name="tObj">要序列化的对象</param>
 7        /// <returns></returns>
 8        public static string SerializeXML<T>(T obj)
 9        {
10            XmlSerializer xs = new XmlSerializer(typeof(T));
11            using (MemoryStream ms = new MemoryStream())
12            {
13                xs.Serialize(ms, obj);
14                ms.Seek(0, SeekOrigin.Begin);
15 
16                byte[] buffer = new byte[ms.Length];
17                int n = ms.Read(buffer, 0, buffer.Length);
18                ms.Close();
19                return System.Text.Encoding.UTF8.GetString(buffer, 0, n);
20            }
21        }
22        /// <summary>
23        /// 反序列化
24        /// </summary>
25        /// <typeparam name="T">反序列化出来对象类型</typeparam>
26        /// <param name="file">要反序列化的文件</param>
27        /// <returns></returns>
28        public static T DeserializeXML<T>(string objContent)
29        {
30            using (MemoryStream ms = new MemoryStream())
31            {
32                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(objContent);
33                ms.Write(buffer, 0, buffer.Length);
34                ms.Seek(0, SeekOrigin.Begin);
35                XmlSerializer xs = new XmlSerializer(typeof(T));
36                T mc = (T)xs.Deserialize(ms);
37                ms.Close();
38                return mc;
39            }
40           
41        }

(3)SOAP序列化
命名空间

using System.Runtime.Serialization.Formatters.Soap;
using System.IO;

 1   public static string SerializeSoap<T>(T obj)
 2         {
 3             SoapFormatter format = new SoapFormatter();
 4             using (MemoryStream ms = new MemoryStream())
 5             {
 6                 format.Serialize(ms, obj);
 7                 ms.Seek(0, SeekOrigin.Begin);
 8 
 9                 byte[] buffer = new byte[ms.Length];
10                 int n = ms.Read(buffer, 0, buffer.Length);
11                 ms.Close();
12                 return System.Text.Encoding.UTF8.GetString(buffer, 0, n);
13             }
14         }
15 
16         public static T DeSerializeSoap<T>(string objContent)
17         {
18             using (MemoryStream ms = new MemoryStream())
19             {
20                 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(objContent);
21                 ms.Write(buffer, 0, buffer.Length);
22                 ms.Seek(0, SeekOrigin.Begin);
23                 SoapFormatter xs = new SoapFormatter();
24 
25                 T mc = (T)xs.Deserialize(ms);
26                 ms.Close();
27                 return mc;
28             }
29         }

 

 

(4)JSON序列化

命名空间

using System.IO;
using System.Text;
using System.Runtime.Serialization.Json;

.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用

 1  /// <summary>
 2     /// JSON序列化
 3     /// </summary>
 4     public static string JsonSerializer<T>(T t)
 5     {
 6         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
 7         using (MemoryStream ms = new MemoryStream())
 8         {
 9             ser.WriteObject(ms, t);
10             string jsonString = Encoding.UTF8.GetString(ms.ToArray());
11             ms.Close();
12             return jsonString;
13         }
14        
15     }
16 
17     /// <summary>
18     /// JSON反序列化
19     /// </summary>
20     public static T JsonDeserialize<T>(string jsonString)
21     {
22         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
23         using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
24         {
25             T obj = (T)ser.ReadObject(ms);
26             ms.Close();
27             return obj;
28         }
29        
30     }

 补充:

JSON的序列化与反序列化也可以用以下方法

.net3.5类库给了直接的方法.很方便吧。

 using System.Web.Script.Serialization;

 1         /// <summary>
 2         /// JSON序列化
 3         /// </summary>
 4         /// <typeparam name="T"></typeparam>
 5         /// <param name="t"></param>
 6         /// <returns></returns>
 7         public static string JsonSerializer<T>(T t)
 8         {
 9             JavaScriptSerializer jss = new JavaScriptSerializer();
10             return jss.Serialize(t);
11         }
12         /// <summary>
13         /// JSON反序列化
14         /// </summary>
15         /// <typeparam name="T"></typeparam>
16         /// <param name="JsonString"></param>
17         /// <returns></returns>
18         public static T JsonDeserializer<T>(string JsonString)
19         {
20             JavaScriptSerializer jss = new JavaScriptSerializer();
21             return jss.Deserialize<T>(JsonString);
22         }

 

整理完毕。通用只是一种说法。可能在数据格式特殊时会有一定的错误。得通过自己去调整额外代码解决了。

 转载的请注原创地址,谢谢。