你应该在设计新类的时候考虑序列化,因为类不能够在它被编译之后变得可序列化。有一些需要提出的问题就是:这个类需要跨应用程序域而被发送吗?这个类曾经通过远程而被使用吗?用户将要使用的类是从我那里继承的一个需要被序列化的新类吗?在出现这些疑问的时候,就可以把类标记成可序列化。这大概要好于把所有的类都标记成是可序列化的,除非下列情况中的任何一种是真实的:
- 类从来都不跨越应用程序域。如果序列化不是必需的并且类需要跨越应用程序域,那么类就可以从 MarshalByRefObject 那里派生。
- 类存储了只对于当前类的实例才可以编程的特殊指针。如果类中只包含了未管理的内存或者文件句柄,例如,确保这些文件被标记了 NonSerializedAttribute 特性,或者根本就不要序列化这个类。
- 类的数据成员包含了敏感信息。在这种情况下,把类标记成可序列化就是明智的,但是需要为包含了敏感信息的单独数据成员标记 NonSerializedAttribute 特性。另外的选择就是实现 ISerializable 接口并且只序列化必需的字段。
你应该知道把类标记成可序列化的安全含意。一个类或者类构造器的 LinkDemand 或者 CodeAccessPermission 的 InheritanceDemand 能够通过默认的或者为相同的 CodeAccessPermission 实现了相应请求的自定义序列化而被迂回。(关于更多信息,请参考:[SecurityAction 枚举]。)如果一个类的许可中拥有 LinkDemand,那么运行时只会检查直接的调用者来核实调用者已经被批准了这个许可。.NET Framework 类库的代码都被以 Microsoft 的强名称来作为签名并且始终被批准完整的信任度来迂回链接时的安全检查。例如,在序列化的情况下,没有必需的序列化许可的恶意代码能够调用任何一种完全信任的 .NET Framework 格式器,比如 BinaryFormatter,以及许可连接请求检查的迂回。