您的位置:首页 > 其它

在.Net中通过序列化和反序列化实现对象实例化

2007-10-17 19:45 549 查看
来源: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 命名空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: