.net中对象序列化技术浅谈
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件中“恢复”对象到序列化之前的状态。
在.net中有提供了几种序列化的方式:
二进制序列化
XML序列化
SOAP序列化
二进制序列化
所谓二进制序列化,指的是对象序列化之后是二进制形式的。二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。
XML序列化
所谓XML序列化,是指对象序列化之后的结果是XML形式的。保存XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。
SOAP序列化
所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP协议传输(不知道SOAP协议?百度一下吧)。SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用,如下图所示:
下面编写一个类用于序列化和反序列化,这个类的代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace MySerializeDemo
{
[Serializable]
/// <summary>
/// 要序列化的对象
/// 作者:周公
/// 编写时间:2009-03-10
/// </summary>
public class MyObject
{
//[NonSerialized]
private string name;
private DateTime birthday;
private string homePlace;
/// <summary>
/// 出生地
/// </summary>
public string HomePlace
{
get { return homePlace; }
set { homePlace = value; }
}
/// <summary>
/// 生日
/// </summary>
public DateTime Birthday
{
get { return birthday; }
set { birthday = value; }
}
/// <summary>
/// 姓名
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 年龄
/// </summary>
public int Age
{
get { return DateTime.Now.Year - birthday.Year; }
}
/// <summary>
/// override了ToString()方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homePlace,Age);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace MySerializeDemo
{
[Serializable]
/// <summary>
/// 要序列化的对象
/// 作者:周公
/// 编写时间:2009-03-10
/// </summary>
public class MyObject
{
//[NonSerialized]
private string name;
private DateTime birthday;
private string homePlace;
/// <summary>
/// 出生地
/// </summary>
public string HomePlace
{
get { return homePlace; }
set { homePlace = value; }
}
/// <summary>
/// 生日
/// </summary>
public DateTime Birthday
{
get { return birthday; }
set { birthday = value; }
}
/// <summary>
/// 姓名
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// 年龄
/// </summary>
public int Age
{
get { return DateTime.Now.Year - birthday.Year; }
}
/// <summary>
/// override了ToString()方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homePlace,Age);
}
}
}
下面是分别用上面的三个类进行序列化和反序列化的代码:
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
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");
}
/// <summary>
/// 二进制序列化对象
/// </summary>
/// <param name="obj"></param>
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());
}
}
/// <summary>
/// 二进制反序列化
/// </summary>
/// <param name="fileName"></param>
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());
}
}
/// <summary>
/// 二进制序列化对象
/// </summary>
/// <param name="obj"></param>
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());
}
}
/// <summary>
/// 二进制反序列化
/// </summary>
/// <param name="fileName"></param>
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());
}
}
/// <summary>
/// XML序列化
/// </summary>
/// <param name="obj"></param>
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());
}
}
/// <summary>
/// XML反序列化
/// </summary>
/// <param name="fileName"></param>
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());
}
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhoufoxcn/archive/2009/03/11/3978874.aspx