什么是序列化
序列化 (serialization)
将对象的状态信息转换为可以存储或传输的窗体的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。
对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
.NET Framework 提供两种序列化技术:
* 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。
* XML 序列化仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。SOAP 同样是一个开放式标准,这使它也成为一个颇具吸引力的选择。
下面是一个序列化的例子:摘自于MSDN
该程序运行在Console应用程序下:
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Microsoft.Samples.CustomOrder
{
public class OrderedClass
{
private int field1;
private string field2;
private string field3;
[XmlElement(Order = 3)]
public string Field3
{
get { return field3; }
set { field3 = value; }
}
[XmlElement(Order = 1)]
public int Field1
{
get { return field1; }
set { field1 = value; }
}
[XmlElement(Order = 2)]
public string Field2
{
get { return field2; }
set { field2 = value; }
}
public OrderedClass()
{
field1 = 1;
field2 = "String1";
field3 = "String2";
}
}
public class UnorderedClass
{
private int field1;
private string field2;
private string field3;
public string Field3
{
get { return field3; }
set { field3 = value; }
}
public int Field1
{
get { return field1; }
set { field1 = value; }
}
public string Field2
{
get { return field2; }
set { field2 = value; }
}
public UnorderedClass()
{
field1 = 1;
field2 = "String1";
field3 = "String2";
}
}
static class Program
{
static void Main()
{
UnorderedClass unordered = new UnorderedClass();
OrderedClass ordered = new OrderedClass();
XmlSerializer unorderedSerializer =
new XmlSerializer(typeof(UnorderedClass));
XmlSerializer orderedSerializer =
new XmlSerializer(typeof(OrderedClass));
Console.WriteLine("Unordered serialization:\n");
unorderedSerializer.Serialize(Console.Out, unordered);
Console.WriteLine("\n\nOrdered serialization:\n");
orderedSerializer.Serialize(Console.Out, ordered);
Console.ReadLine();
}
}
}