问题 为什么我不能创建一个Serializable类?


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

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


2076
2018-03-28 21:59


起源

您应该避免在视图状态中存储任何不必存在的内容 - Joe Phillips


答案:


首先。避免使用viewstate。

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

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

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

序列化DTO和消息。

这更像是一种设计选择。


9
2018-03-28 22:09



二进制(非文本)序列化根本没有区别,并且可以 绝对 独立于平台。问题是像BinaryFormatter这样的东西 一 二进制序列化器。 - Marc Gravell♦
(但我同意你的其他观点;当我有更多选票时,我会尽力记住+1动力) - Marc Gravell♦
我从来没有说它不依赖于平台,只是略有不同。你必须考虑特殊情况。二进制序列化保留实例标识。 (它的价值)和文本序列化可以看作保存到光盘的内存“克隆” - Slappy
你强调了文本序列化 是 平台不可知;这意味着差异。重新“实例身份”(评论), 再次 这与二元对比没有任何关系;有文本序列化器保留身份(DCS在全图模式下),并且有二进制序列化器 不要。我的观点:你在描述二进制/文本序列化之间的一些人为差异,这实际上就是它的特征 不同的序列化器 (它们本身可以是二进制或基于文本的)。 - Marc Gravell♦
诚然。我指的是盒子里的.Net东西。删除了刑事判决。 - Slappy


将其标记为 [Serializable] (要么 ISerializable)任何使用的东西都是必要的 BinaryFormatter,可能包括默认配置下的viewstate。至于良好与不良的做法......好吧,大多数课程 不需要序列化和IMO即使它们正在使用 BinaryFormatter 并不总是最好的选择*。特别是,将其标记为两者 [Serializable] 和 [DataContract] 将导致IIRC例外。

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


3
2018-03-28 22:02





制作所有课程是一种很好的做法 实际上是Serializable 如 Serializable。我会用的 常识,并为那些用于跨越流程边界的类(DTO类)设置它。

所以那些类:

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

3
2018-03-28 22:02