我在我的视图状态中存储了一些对象,我想知道创建一个类Serializable
是否有任何缺点?
制作所有课程Serializable
?
答案 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类)设置它。
所以那些类: