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.