来源:khler的专栏 - CSDNBlog
有时,您会发现需要保存组件的状态。例如,可以这样做以保存有关组件用户的个人信息,或者更改自定义控件的默认配置。
可以通过一个称为“序列化”的过程将组件的状态保存到文件中。序列化允许将对象转换成数据流,然后可以将数据流保存到文件中。数据流可以通过反序列化再转换成对象。
.NET Framework 为序列化提供了两个格式化程序:BinaryFormatter 类和 SoapFormatter 类。这些类通过通常在内存中的“对象图”(对象在内存中的表示形式)并将其转换成数据流。正如它们各自的名称所表示的,BinaryFormatter 将对象图转换成二进制流(对桌面应用程序最有用),而 SOAPFormatter 将对象图转换成简单对象访问协议 (SOAP) 格式(对 Internet 应用程序最有用)。这些流然后保存为文件,在需要时可以反序列化和转换回对象。
序列化流
保存组件状态
对要序列化的组件应用 SerializableAttribute 特性。
[Serializable()]public class Account{ // ' Insert code to implement class.}
创建该类的一个实例作为要保存的对象。
Account myAccount = new Account();
创建一个 Stream 对象作为将为序列化数据提供储存库的文件。
using System.IO;
// This creates a new file with the name SavedAccount.txt, and creates
// a Stream object to write data to that file. The GetFolderPath method
// is used to get the path to the current user's Personal folder.
Stream myFileStream = File.Create (System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
创建一个格式化程序类实例。
如果要将对象图转换成二进制流,创建一个 BinaryFormatter 类实例。
using System.Runtime.Serialization.Formatters.Binary;
BinaryFormatter serializer = new BinaryFormatter();
如果要将对象图转换成 SOAP 流,创建一个 SoapFormatter 类实例。
注意 项目中必须有对 System.Runtime.Serialization.Formatters.Soap 命名空间的引用。
using System.Runtime.Serialization.Formatters.Soap;
SoapFormatter serializer = new SoapFormatter();
调用格式化程序的 Serialize 方法,将对象写入 Stream。
serializer.Serialize(myFileStream, myAccount);
myFileStream.Close();
关闭文件流以完成序列化。
现在 SavedAccount.txt 文件中有一个以二进制格式保存的对象实例。
反序列化流
保存了对象后,有时需要检索它。可以用序列化组件时使用的同一格式化程序来反序列化组件。
还原保存的组件
将同一类型的某个变量声明为要还原的类。
Account restoredAccount;
创建一个 Stream 对象并打开包含序列化对象的文件。
using System.IO;
Stream myFileStream = File.OpenRead (System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
创建一个与序列化数据时使用的格式化程序类具有相同类型的实例。
下面的示例显示如何使用 BinaryFormatter 类。
using System.Runtime.Serialization.Formatters.Binary;
BinaryFormatter deserializer = new BinaryFormatter();
下面的示例显示如何使用 SoapFormatter 类。
注意 项目中必须已有对 System.Runtime.Serialization.Formatters.Soap 命名空间的引用。
using System.Runtime.Serialization.Formatters.Soap;
SoapFormatter deserializer = new SoapFormatter();
调用格式化程序的 Deserialize 方法将文件流转换成一个对象图,并通过显式类型转换将该对象图转换成所需类型的对象。
// The explicit cast converts the file stream to an object of the type
// specified. If the object in the file stream cannot be converted to
// the specified type, an error will result.
restoredAccount = (Account)(deserializer.Deserialize(myFileStream));
myFileStream.Close();
安全说明 不应使用此技术来存储任何敏感数据或保密数据,因为这不是确保数据安全的可接受方式。有关为数据创建安全加密方案的信息,请参见 System.Security.Cryptography 命名空间。