16

我今天意识到,多年来我一直盲目地遵循这个要求,而没有真正问过为什么。今天,我在从头开始创建的模型对象中遇到了 NotSerializableException,我意识到足够了。

有人告诉我这是因为负载平衡服务器之间的会话复制,但我知道我在会话范围内看到了其他不实现可序列化的对象。这是真正的原因吗?

4

3 回答 3

10

因为为了通过电线传输,它们需要可序列化为可以放在电线上的形式。

像二进制,或xml,Json,或类似的

这里有更多信息......任何域对象都应该是不可序列化的吗?

于 2010-03-16T01:16:09.817 回答
9

这是真正的原因。在实践中是否真正重要完全取决于 Web 服务器或应用程序服务器是否会序列化对象(或验证它是否可序列化,但实际上唯一的方法是实际序列化它)。

大多数应用程序服务器都可以选择(至少)对其不严格。如果您不使用实际共享状态的负载平衡服务器,那么您可能会毫无问题地看到它。

于 2010-03-16T01:49:15.140 回答
2

我认为这个概念类似于被问到,为什么在吞咽消化之前必须咀嚼固体食物。但当然,不同之处在于消化好的东西无论如何都不能反序列化。

我记得使用 Sun RPC(现在称为 ONC RPC)执行 XDR 编码,因为计算机平台/系统以各自的形式表示它们的数据。例如,大端与小端。

但是JVM,不管机器是大端的,所以字节序不应该是一个原因。

计算机内存中的数据结构具有指针,对象的所有元素可能不会位于连续的内存块上。但是,当您通过 i/o 将对象传递给另一个系统时,您无法传递该对象的内存分布。

对象需要在存储到数据库之前进行序列化,因为您不希望也不希望复制系统内存的动态变化排列。

我们在网络上的数据表示层都是基于比特流的。因此,当您希望将数据从一个系统传递到另一个系统时,您必须将内存中表示的维度数据转换为可以通过网络逐字节传输的维度数据。实际上,一点一点,通常是压缩和安全加密。压缩和加密例程是 oo-structure-blind 的,并且假定比特流。网络交换机是oo-structure-blind的。网络传输甚至看不到位。这些比特被编码成通常是模拟正弦波的传输信号,然后进行调制。这些过程不适用于 oo 结构化数据的多维/分层模式。

我猜你可以执行对象级别的混淆和加密,但你仍然必须允许系统将它们转换为比特流,首先将它们转换为字符流。

编组是当牧羊人有一群羊并将它们编组通过在混乱水域上的单羊桥时。因此,编组器必须将我们的对象编组为带有写入引用的串行模式,以便当信息羊群从桥的另一端出现时,我们能够通过共轭-去编组器将它们重新组合回其层次模式. 在我们的案例中,我们的绵羊不仅仅是一座桥,而是通过狭窄而不稳定的蜿蜒曲折和山体滑坡,网络传输设备在每个转弯处都存储了一份已编组的绵羊副本,以确保它们能够在任何情况下重新发送副本。羊掉进了沟壑。

于 2010-03-16T06:47:15.560 回答