序列化准则

由于编译类之后不能使类可序列化,因此设计新的类时应考虑序列化。有些要问的问题是:需要跨应用程序域发送此类吗?此类可用于远程处理吗?用户将对此类进行哪些操作?他们会从需要序列化的我的类派生新类吗?当无法确定时,请将此类标记为可序列化。除非可确定以下任一情况,否则可能最好将所有类标记为可序列化。

  • 类永远不会跨应用程序域。如果不需要序列化并且类需要跨应用程序域,则请从 MarshalByRefObject 派生类。

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

  • 类数据成员包含敏感信息。在此情况下,建议将类标记为可序列化,但建议用 NonSerializedAttribute 特性标记包含敏感信息的各数据成员。另一个方法是实现 ISerializable 接口并只序列化所需的字段。

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

另请参见

其他资源

二进制序列化
Remote Objects
XML 和 SOAP 序列化
Security and Serialization