我今天意识到我已经盲目地按照这个要求多年没有真正问过为什么。今天,我遇到了一个NotSerializableException和我从头创建的模型对象,我意识到足够了。
我被告知这是因为负载均衡服务器之间的会话复制,但我知道我在会话范围内看到了其他没有实现Serializable的对象。这是真正的原因吗?
答案 0 :(得分:10)
因为为了通过电线传输,它们需要可以串行化为可以放在电线上的形式。
像二进制,或xml,Json或simillar
这里有更多信息...... Should any domain object, not be serializable?
答案 1 :(得分:5)
这是真正的原因。如果它在实践中实际上重要,完全取决于Web服务器或应用程序服务器是否实际上序列化对象(或验证它是可序列化的,但实际上,唯一的方法是实际序列化它)。
大多数应用程序服务器都有(至少)对它不严格的选项。如果您不使用实际共享状态的负载平衡服务器,那么您可能已经看到它没有问题。
答案 2 :(得分:2)
我认为这个概念类似于被问到, 为什么必须在吞下消化之前将固体食物咀嚼。 但当然,区别在于消化的商品无论如何都不能被反序列化。
我记得使用Sun RPC(现在称为ONC RPC)来执行XDR编码 因为计算机平台/系统以各自的形式表示他们的数据。例如, big endian vs small endian。
但JVM,无论机器是大端的,所以字节顺序不应成为理由。
计算机内存中的数据结构具有指针,并且对象的所有元素可能不会位于连续的内存块上。但是,当您将对象传递到另一个系统时,您无法传递该对象的内存分布。
对象需要在存储到数据库之前进行序列化,因为您不需要并且不希望复制动态更改的系统内存排列。
我们在网络上的数据表示层都是基于比特流的。因此,当您希望将数据从一个系统传递到另一个系统时,您必须将内存中表示的维度数据转换为可以逐字节地在网络上流式传输的维度数据。实际上,一点一滴,经常进行压缩和安全加密。压缩和加密例程是oo-structure-blind和假定的比特流。网络交换机是oo-structure-blind。网络传输甚至看不到位。这些比特被编码成传输信号,该传输信号通常是模拟正弦波,然后被调制。这些过程不适用于oo结构数据的多维/分层模式。
我猜你可以执行对象级混淆和加密,但你仍然必须允许系统将它们转换为比特流,首先将它们转换为字符串流。
编组是当牧羊人有一群绵羊和马歇尔群岛,他们在一片困难的海水上穿过一座单羊桥。因此,编组人员必须将我们的对象编组到带有写入的引用的串行模式中,这样当信息羊从桥的另一端出现时,我们能够通过共轭 - demarshaller将它们重新组装回其分层模式中。 。在我们的例子中,我们的绵羊不仅仅是一座桥梁,而是狭窄而不稳定的绕组和山体滑坡,每个转弯处的网络传输设备都存储了编组的绵羊的副本,以确保他们能够重新发送副本,以防任何一个绵羊已经下了山沟。