为啥我不应该让一个类可序列化?

Posted

技术标签:

【中文标题】为啥我不应该让一个类可序列化?【英文标题】:Why should I not make a class Serializable?为什么我不应该让一个类可序列化? 【发布时间】:2011-07-24 20:19:24 【问题描述】:

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

将所有课程都设为Serializable 是不好的做法吗?

【问题讨论】:

你应该避免在视图状态中存储任何不需要的东西 【参考方案1】:

首先。避免视图状态。

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

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

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

序列化 DTO 和消息。

这更多是一种设计选择。

【讨论】:

二进制(非文本)序列化完全没有区别,并且可以绝对独立于平台。问题在于 BinaryFormatter 之类的东西,它只是 一个 二进制序列化器。 (不过我同意你的其他观点;当我有更多选票时,我会尽量记住 +1 推动力) 我从未说过它不依赖于平台,只是略有不同。你必须考虑特殊情况。二进制序列化保留实例身份。 (对于它的价值)和文本序列化可以看作是保存到磁盘的内存“克隆” 您强调文本序列化平台无关;这意味着不同。重新“实例化身份”(评论),再次这与二进制与否无关;有保留身份的文本序列化程序(全图模式下的 DCS),还有一些的二进制序列化程序。我的观点:您描述的是二进制/文本序列化之间的一些人为差异,它们实际上只是不同序列化器(它们本身可以是二进制或基于文本)的简单特征。 确实如此。我在这里指的是开箱即​​用的 .Net 东西。删除了刑事判决。【参考方案2】:

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

所以那些类:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于为啥我不应该让一个类可序列化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该总是让我的异常[可序列化]? (。网)

在 Boost.MPI 中使类可序列化是啥意思?

如何使扩展非可序列化的java类可序列化

在Boost.MPI中使类可序列化是什么意思?

如何使具有多个 init args 的自定义异常类可腌制

为啥我应该只用护照序列化用户存储 user.id? [复制]