【问题标题】:Why do transfer objects need to implement Serializable?为什么传输对象需要实现Serializable?
【发布时间】:2011-01-27 22:27:52
【问题描述】:

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

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

【问题讨论】:

    标签: java serialization data-transfer-objects


    【解决方案1】:

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

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

    但是JVM,不管机器是big-endian,所以endianness不应该是一个原因。

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

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

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

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

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

    【讨论】:

    • 消化好的食物无论如何都不能反序列化这取决于食物最初是什么。我的狗可以这样做>:)
    • 我的狗也吃序列化的食物。呃。存在一种理论,为什么狗有时会吃序列化的食物。原因是它们的肠道很短,所以当狗吃自己的系列食物时,它的消化道会延长两倍。而当它吃另一种哺乳动物(如马)的食物时,它是在借用马的消化系统,因为它不能像马或牛那样有效地处理草纤维。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。说得通。那么,任何没有实现 Serializable 的会话范围的对象要么自己不维护状态,要么运行在不共享状态的负载平衡服务器上?
    • 一个对象将无法序列化,无论它维护的任何状态,只要它不实现可序列化,所以如果我正确理解你的问题,答案是任何对象放在会话中没有实现 Serializable 实际上没有被容器序列化,所以你没有看到问题。
    • @Yishai 道歉。我还是不明白。对于一个会话对象,我们得到异常而不是其他会话对象,那么这两个对象之间的区别是什么?或者他们如何/为什么被区别对待?这里的对象状态维护是什么意思?
    【解决方案3】:

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

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

    这里有更多信息...Should any domain object, not be serializable?

    【讨论】:

    • 我不认为你需要实现 Serializeble 来让 XML 或 JSON 编组通过网络进行解组。对于二进制格式,您需要它——例如在 RMI 中。但我认为主要原因是因为这些 DTO 是 HTTP 会话的一部分,因此必须根据 servlet 规范进行序列化。
    猜你喜欢
    • 2021-06-09
    • 2010-09-15
    • 2013-05-01
    • 1970-01-01
    • 2018-07-29
    • 2012-06-17
    • 2010-10-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多