序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解。
一、什么序列化和反序列化
序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中。反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程。
然而为什么需要序列化和反序列化这样的机制呢?这个问题也就涉及到序列化和反序列化的用途了,
对于序列化的主要用途有:
- 将应用程序的状态保存在一个磁盘文件或数据库中,并在应用程序下次运行时恢复状态。例如, Asp.net 中利用序列化和反序列化来保存和恢复会话状态。
- 一组对象可以轻松复制到Windows 窗体的剪贴板中,再粘贴回同一个或者另一个应用程序。
- 将对象按值从一个应用程序域中发送到另一个程序域
并且如果把对象序列化成内存中的字节流,就可以利用一些其他的技术来处理数据,例如,对数据进行加密和压缩等。
二、序列化和反序列简单使用
.Net Framework 提供二种序列化方式:
- 二进制序列化
- XML 和SOAP序列化
序列化和反序列化的简单使用:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Serializable
{
[Serializable]
public class Person
{
public string personName;
[NonSerialized]
public string personHeight;
private int personAge;
public int PersonAge
{
get { return personAge; }
set { personAge = value; }
}
public void Write()
{
Console.WriteLine("Person Name: "+personName);
Console.WriteLine("Person Height: " +personHeight);
Console.WriteLine("Person Age: "+ personAge);
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.personName = "Jerry";
person.personHeight = "175CM";
person.PersonAge = 22;
Stream stream = Serialize(person);
//为了演示,都重置
stream.Position = 0;
person = null;
person = Deserialize(stream);
person.Write();
Console.Read();
}
private static MemoryStream Serialize(Person person)
{
MemoryStream stream = new MemoryStream();
// 构造二进制序列化格式器
BinaryFormatter binaryFormatter = new BinaryFormatter();
// 告诉序列化器将对象序列化到一个流中
binaryFormatter.Serialize(stream, person);
return stream;
}
private static Person Deserialize(Stream stream)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
return (Person)binaryFormatter.Deserialize(stream);
}
}
}
主要是调用System.Runtime.Serialization.Formatters.Binary命名空间下的BinnaryFormatter类来进行序列化和反序列化,调用反序列化后的结果截图: