序列化指南

在设计新类时应该考虑序列化,因为编译了类之后,就不能再使该类可序列化了。应该提出下列问题:该类是否需要跨应用程序域发送?该类是否将与远程处理一起使用?用户将使用该类做什么?他们可能会从我的类派生需要序列化的新类吗?如果不确定,请将该类标记为可序列化。最好是将所有类标记为可序列化,除非下列任一条件为真:

  • 类永远不跨应用程序域发送。如果序列化不是必需的并且该类需要跨应用程序域,则从 MarshalByRefObject 派生该类。

  • 类存储只适用于该类的当前实例的特殊指针。例如,如果一个类包含非托管的内存或文件句柄,则确保这些文件使用 NonSerializedAttribute 属性标记,或者根本不序列化该类。

  • 类数据成员包含敏感的信息。这种情况下,最好将类标记为可序列化,但使用 NonSerializedAttribute 属性标记包含敏感信息的个别数据成员。另一种方法是实现 ISerializable 接口并且只序列化必需的字段。

注意将类标记为可序列化所隐含的安全问题。默认情况下,可以避开类或类构造函数的 CodeAccessPermission 的 Link Demand 或 Inheritance Demand,也可以自定义为同一 CodeAccessPermission 实现相应要求的序列化。(有关更多信息,请参见 SecurityAction 枚举。)如果类有权限的 Link Demand,则运行库只检查直接调用方以验证此调用方是否已被授予该权限。.NET Framework 类库代码用 Microsoft 强名称进行了签名,并且始终被授予完全信任。任何代码都可以使用被授予完全信任的代码避开链接时的安全检查。例如,在序列化时,不具有所需序列化权限的恶意代码可以调用某个完全受信任的 .NET Framework 格式化程序(如 BinaryFormatter),避开权限的链接要求检查。

请参见

概念

安全和序列化

其他资源

二进制序列化
远程对象
XML 和 SOAP 序列化