bootstrap easyui RunJS JSFiddle codepen Gist

c#将对象序列化为字符串和将字符串反序列化为对象

asp.net开发中,页面间传值最长用到的是url显式传参,session,application和cookie传值等。对于复杂对象页面传值,如果不考虑性能影响的话,通常可以使用session或者application。那么页面间如何通过url传递复杂对象呢?正像标题说的那样,对象-->字符串,然后字符串-->对象。这个过程可以用下面的代码来实现:
Code
using
System;
using System.Runtime.Serialization;
using
System.Runtime.Serialization.Formatters.Binary;
using
System.IO;

namespace DotNet.Common.Utilities
{
     public class
SerializeObj
     {
         public SerializeObj()
         {
}

         /// <summary>
         /// 序列化 对象到字符串
         ///
</summary>
         /// <param
name="obj">泛型对象</param>
         ///
<returns>序列化后的字符串</returns>
         public static string
Serialize<T>(T obj)
         {
             try
            
{
                 IFormatter formatter = new
BinaryFormatter();
                 MemoryStream stream = new
MemoryStream();
                 formatter.Serialize(stream,
obj);
                 stream.Position = 0;
                 byte[] buffer
= new byte[stream.Length];
                 stream.Read(buffer, 0,
buffer.Length);
                 stream.Flush();
                
stream.Close();
                 return
Convert.ToBase64String(buffer);
             }
             catch
(Exception ex)
             {
                 throw new
Exception("序列化失败,原因:" + ex.Message);
             }
        
}

         /// <summary>
         /// 反序列化 字符串到对象
        
/// </summary>
         /// <param
name="obj">泛型对象</param>
         /// <param
name="str">要转换为对象的字符串</param>
         ///
<returns>反序列化出来的对象</returns>
         public static T
Desrialize<T>(T obj, string str)
         {
            
try
             {
                 obj = default(T);
                
IFormatter formatter = new BinaryFormatter();
                 byte[] buffer
= Convert.FromBase64String(str);
                 MemoryStream stream = new
MemoryStream(buffer);
                 obj =
(T)formatter.Deserialize(stream);
                
stream.Flush();
                 stream.Close();
            
}
             catch (Exception ex)
             {
                
throw new Exception("反序列化失败,原因:" + ex.Message);
            
}
             return obj;
         }
    
}
}需要注意的是,通过url传递参数(get方式),参数的总长度有一定限制(对于过长的参数,不懂技术的用户是有心理障碍的)。如果复杂对象序列化为字符串后的长度超过get方式的限制,那么这个对象的传值就不适合用url显式传递,可以选择其他途径如post方式或Session方式等等。

总结:序列化 与 反序列化的思路

序列化:

.NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer.

其中BinaryFormattter最简单,它是直接用二进制方式把对象(Object)进行串行或反串,他的优点是速度快,可以串行private或者protected的member, 在不同版本的。NET中都兼容,可以看作是。NET自己的本命方法,当然缺点也就随之而来了,离开了。NET它就活不了,所以不能在其他平台或跨网路上进行。

实现步骤:

1.建立BinaryFormatter对象。

2.使用BinaryFormatter对象的将对象序列化到内存流中。

3.将内存流中的内容读取到一个byte数组中去,注意从流的那个位置读取,要设置Position.

4.使用流的Flush,Close方法,将缓存中的数据强制写到目标对象中去。Flush()函数的作用就是强制将当前的缓冲区的内容写入目标设备上面。

5.将byte数组转化为string.

反序列化:

实现步骤:

1.将string转化为byte数组。

2.将byte数组放入到内存流中.

3.使用BinaryFormatter对象将内存流反序列化为类.

4.使用流的Flush,Close方法,将缓存中的数据强制写到目标对象中去。

过程图:

类型---->BinaryFormatter序列化---->内存流--->byte数组---->string.

类型<----BinaryFormatter反序列化<----内存流<---byte数组<----string.

posted @ 2012-10-07 11:27  lvyafei  阅读(702)  评论(0编辑  收藏  举报
博客地址:lvyafei 返回顶部   返回顶部   返回顶部 站长QQ,点击这里给我发消息
无觅关联推荐,快速提升流量