定义:序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
作用:1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
实现方法:BinaryFormatter、SoapFormatter、XML序列化
一、BinaryFormatter
主要就是调用System.Runtime.Serialization.Formatters.Binary空间下的BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。
二、SoapFormatter序列化方式
主要就是调用System.Runtime.Serialization.Formatters.Soap空间下的SoapFormatter类进行序列化和反序列化,使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
序列化之后的文件是Soap格式的文件(简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻 量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传 输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程 序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。)
三、XML序列化方式
主要就是调用System.Xml.Serialization 空间下的XmlSerializer类进行序列化和反序列化
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap; //使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
using System.Xml.Serialization;
namespace MySerializeDemo
{
class Program
{
static void Main(string[] args)
{
MyObject obj = new MyObject();
obj.Birthday = new DateTime(1979, 11, 7);
obj.HomePlace = "湖北";
obj.Name = "周公";
Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。====");
BinarySerialize(obj);
BinaryDeserialize(@"C:/MyObject.dat");
Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。====");
SoapSerialize(obj);
SoapDeserialize(@"C:/MyObject.soap");
Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。====");
XMLSerialize(obj);
XMLDeserialize(@"C:/MyObject.xml");
Console.ReadLine();
}
public static void BinarySerialize(MyObject obj)
{
using (FileStream stream = new FileStream(@"C:/MyObject.dat", FileMode.Create, FileAccess.Write))
{
BinaryFormatter formater = new BinaryFormatter();
formater.Serialize(stream, obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
}
}
public static void BinaryDeserialize(string fileName)
{
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
BinaryFormatter formater = new BinaryFormatter();
MyObject obj=(MyObject)formater.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
}
}
public static void SoapSerialize(MyObject obj) {
using (FileStream stream = new FileStream(@"C:/MyObject.soap", FileMode.Create, FileAccess.Write)) {
SoapFormatter formater = new SoapFormatter();
formater.Serialize(stream, obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
}
}
public static void SoapDeserialize(string fileName) {
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
SoapFormatter formater = new SoapFormatter();
MyObject obj = (MyObject)formater.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
}
}
public static void XMLSerialize(MyObject obj) {
using (FileStream stream = new FileStream(@"C:/MyObject.xml", FileMode.Create, FileAccess.Write)) {
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
serializer.Serialize(stream,obj);
Console.WriteLine("对象已经被序列化。" + obj.ToString());
}
}
public static void XMLDeserialize(string fileName) {
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
MyObject obj = (MyObject)serializer.Deserialize(stream);
Console.WriteLine("对象已经被反序列化。" + obj.ToString());
}
}
}
//用XML序列化时可以不加下面的标示
[Serializable]
public class MyObject {
private string name;
private DateTime birthday;
private string homePlace;
public string Name {
get { return name; }
set { name = value; }
}
public DateTime Birthday {
get { return birthday; }
set { birthday = value; }
}
public string HomePlace {
get { return homePlace; }
set { homePlace = value; }
}
public int Age {
get { return DateTime.Now.Year - birthday.Year; }
}
public override string ToString()
{
return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}", name, birthday, homePlace, Age);
}
}
}