序列化
序列化是对象状态转换为可保持或传输的格式过程。与序列化相对的就是反序列化,它将刘转换为对象。这两个多呈结合起来,可以轻松地存储和传输数据。.NET.Framework提供二进制序列化和XML序列化两种技术
二进制序列化保持类型保真度,这对于在应用程序的不同调用间保留对象的状态很有用。例如,通过将对象序列化到剪切板,可在不同的应用程序之间共享对象,可将对象序列化到流,磁盘,内存和网络等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。
XML序列化仅序列化公共属性和字段,且不保持类型保真度。要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于XML是一个开放式标准,因此对于通过Web共享数据而言,这是一个很好的选择。SOAP同样是一个开放式便准,这使它也成为了一个颇具吸引力的选择
二进制序列化可被定义为对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段,私有字段以及类的名称(包括含有该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时。创建原始对象的精确副本,使一个类可序列化的最简单方式是使用Serializable属性标记(将[Serializable]放在要标记的类前,且该类无法被继承)
二进制序列化和反序列化的格式化程序使用BinaryFormatter非常有效,生成了非常简洁的字节流。通过该格式化程序序列化的所有对象也可以通过该格式化程序进行反序列化,这使该工具对于序列化将在.NET Framework上被反序列化的对象而言十分理想
using System;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace test
{
[Serializable]//提示一个类可以序列化,无法继承此类
public class MyObject
{
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
class Program
{
static void Main(string[] args)
{
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str="Some String";
//Iformatter提供将序列化对象格式化的功能
IFormatter formatter = new BinaryFormatter();
//使用指定的路径,创建模式,读/写权限和共享权限
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);//Serialize将对象或具有跟定根的对象图形序列化为所提供的流
stream.Close();
formatter = new BinaryFormatter();
stream = new FileStream("MyFile.bin",FileMode.Open,FileAccess.Read,FileShare.Read);
obj = null;
obj = (MyObject)formatter.Deserialize(stream);//Deserialize反序列化所提供流中的数据并重新组成对象图形
stream.Close();
Console.WriteLine("n1:{0}",obj.n1);
Console.WriteLine("n2:{0}",obj.n2);
Console.WriteLine("str:{0}",obj.str);
Console.ReadKey();
}
}
}
XML序列化可具有多种形式,从简单到复杂的都有。例如,可以序列化仅包含公共字段和属性的类
using System;
using System.IO;
using System.Xml.Serialization;
namespace test
{
public class OrderedItem//要被序列化的类,并没有[Serializable]标记
{
public string ItemName;
public string Description;
public decimal UnitPrice;
public int Quantity;
public OrderedItem()
{
ItemName = "Widget";
Description = "Regular Widget";
UnitPrice = (decimal)2.30;
Quantity = 10;
}
public void Print()
{
Console.WriteLine("ItemName='{0}'",ItemName);
Console.WriteLine("Description='{0}'",Description);
Console.WriteLine("UnitPrice={0}",UnitPrice);
Console.WriteLine("Quantity={0}",Quantity);
}
}
class Program
{
static void Main(string[] args)
{
OrderedItem item = new OrderedItem();
Console.WriteLine("Before serialization the object contains:");
item.Print();
Stream stream = File.Open("OrderedItem.xml",FileMode.Create);
XmlSerializer serializer = new XmlSerializer(typeof(OrderedItem));
serializer.Serialize(stream,item);
stream.Close();
item = null;
//打开文件“date.xml”,从它反序列化
stream = File.Open("OrderedItem.xml",FileMode.Open);
item = (OrderedItem)serializer.Deserialize(stream);
stream.Close();
Console.WriteLine("\nAfter deserialization the object contains:");
item.Print();
}
}
}
程序运行后,在Debug文件夹产生XML文件OrderedItem.xml,内容如下
<?xml version="1.0"?>
<OrderedItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ItemName>Widget</ItemName>
<Description>Regular Widget</Description>
<UnitPrice>2.3</UnitPrice>
<Quantity>10</Quantity>
</OrderedItem>