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