13

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

制作所有课程是不好的做法Serializable吗?

4

3 回答 3

10

首先。避免视图状态。

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

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

总而言之:当您有上下文方法并存储数据供第三方使用时,请勿序列化。(就像带有方法的服务响应是一个坏主意)。当类包含资源引用时不要序列化。尽可能让您的可序列化对象远离方法。这可能需要对服务类型模式进行一些重构。

序列化 DTO 和消息。

这更多是一种设计选择。

于 2011-03-28T22:09:03.423 回答
4

将所有实际上可序列化的类设置为Serializable. 我只会使用常识,并将其设置为那些旨在跨越进程边界的类(DTO 类)。

所以它是那些类:

  • 它们的所有属性都是简单类型
  • 如果它们具有复杂的属性,它们的类型本身是可序列化的
于 2011-03-28T22:02:26.377 回答
3

将其标记为[Serializable](或ISerializable)对于使用 的任何内容都是必要的BinaryFormatter,这很可能包括默认配置下的视图状态。至于好与坏的做法……嗯,大多数课程不需要序列化,即使是 IMO,使用BinaryFormatter也不总是最好的选择*。具体来说,将其标记为两者[Serializable][DataContract]会导致 IIRC 异常。

*=实际上,IMO很少BinaryFormatter是一个好的选择,但我可能有偏见......而且我故意不使用视图状态;p

于 2011-03-28T22:02:02.537 回答