【发布时间】:2011-07-24 20:19:24
【问题描述】:
我在视图状态中存储了一些对象,我想知道创建类 Serializable 是否有任何缺点?
将所有课程都设为Serializable 是不好的做法吗?
【问题讨论】:
-
你应该避免在视图状态中存储任何不需要的东西
标签: c# asp.net serializable
我在视图状态中存储了一些对象,我想知道创建类 Serializable 是否有任何缺点?
将所有课程都设为Serializable 是不好的做法吗?
【问题讨论】:
标签: c# asp.net serializable
首先。避免视图状态。
通常序列化(文本)用于传输对象。
您应避免将任何非 DTO(数据传输对象)或消息类的类标记为可序列化。我们这样做有几个原因。以序列化格式获取您的类的内容可能没有非 DTO 类的方法信息(在原始程序集中)。其次,一个类可能引用资源(数据库连接、文件句柄等)不要序列化这些,因为反序列化不会重新建立资源连接和状态,除非明确设计,但这仍然是一个坏主意。
总而言之:当您有上下文方法并存储数据以供第三方使用时,请勿序列化。 (就像带有方法的服务响应是一个坏主意)。当类包含资源引用时不要序列化。尽可能让您的可序列化对象远离方法。这可能需要对服务类型模式进行一些重构。
序列化 DTO 和消息。
这更多是一种设计选择。
【讨论】:
最好将所有实际上可序列化的类设置为Serializable。我只会使用常识,并将其设置为那些旨在跨越进程边界的类(DTO 类)。
所以那些类:
【讨论】:
将其标记为[Serializable](或ISerializable)对于使用BinaryFormatter 的任何内容都是必要的,这很可能包括默认配置下的视图状态。至于好与坏的做法……嗯,大多数类不需要序列化,即使是 IMO,使用 BinaryFormatter 也并不总是最好的选择*。具体来说,将其标记为[Serializable] 和[DataContract] 将导致IIRC 异常。
*=实际上,IMO BinaryFormatter很少是一个不错的选择,但我可能有偏见……而且我故意不使用视图状态;p
【讨论】: