时间:2011-03-28 21:59:02

标签: c# asp.net serializable

我在我的视图状态中存储了一些对象,我想知道创建一个类Serializable是否有任何缺点?

制作所有课程Serializable

是不好的做法

3 个答案:

答案 0 :(得分:9)

首先。避免使用viewstate。

通常序列化(文本)用于传输对象。

您应该避免将任何类标记为不是DTO(数据传输对象)或消息类的可序列化。我们这样做有几个原因。什么曾经以序列化格式提取你的类可能没有非DTO类的方法信息(在原始程序集中)。其次,类可以引用资源(数据库连接,文件句柄等)不要序列化这些,因为反序列化不会重新建立资源连接和状态,除非明确设计,但仍然是一个坏主意。

总而言之:当你有上下文方法并存储数据供第三方使用时,不要序列化。 (就像使用方法的服务响应是一个坏主意)。当类包含资源引用时,请不要序列化。尽可能保持可序列化对象不受方法影响。这可能需要稍微考虑一下服务类型模式。

序列化DTO和消息。

这更像是一种设计选择。

答案 1 :(得分:3)

使用[Serializable]的任何内容都需要将其标记为ISerializable(或BinaryFormatter},这可能包含默认配置下的viewstate。至于良好与不良的做法......好吧,大多数课程不需要序列化,即使IMO使用BinaryFormatter并不总是最佳选择*。具体而言,将其标记为[Serializable][DataContract]将导致异常IIRC。

* =实际上,IMO BinaryFormatter 很少是一个不错的选择,但我可能有偏见......我故意不使用viewstate; p

答案 2 :(得分:3)

实际可序列化的所有类设为Serializable是一种很好的做法。我只想使用常识,并为那些用于跨越流程边界的类(DTO类)设置它。

所以那些类:

  • 他们所有的属性都是简单类型
  • 如果他们有复杂的属性,他们的类型本身是可序列化的