Java 为什么传输对象需要实现可序列化?

Java 为什么传输对象需要实现可序列化?,java,serialization,data-transfer-objects,Java,Serialization,Data Transfer Objects,我今天意识到,多年来我一直盲目地遵循这一要求,从未真正问过为什么。今天,我遇到了一个NotSerializableException和一个我从头创建的模型对象,我意识到足够了 我被告知这是因为负载平衡服务器之间的会话复制,但我知道我在会话范围内看到了其他不实现可序列化的对象。这是真正的原因吗?因为为了通过导线传输,它们需要可序列化为可以放在导线上的形式 比如二进制文件、xml、Json或类似文件 这里有更多信息 这才是真正的原因。在实践中,它是否真正重要完全取决于web服务器或应用程序服务器是否

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


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

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

比如二进制文件、xml、Json或类似文件


这里有更多信息

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


大多数应用服务器都可以(至少)不严格要求它。如果您不使用实际共享状态的负载平衡服务器,那么您可能会看到它没有问题。

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

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

但是JVM,不管机器是大端,所以端不应该是一个原因

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

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

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

我想您可以执行对象级模糊处理和加密,但是您仍然必须允许系统将它们转换为比特流,首先将它们转换为字符流


编组是指牧羊人有一群羊,并将它们编组通过一座横跨混乱水域的羊桥。因此,封送员必须将我们的对象封送到串行模式中,并在其中写入引用,以便当信息羊群从桥的另一端出现时,我们能够通过共轭解送器将它们重新组合到其层次模式中。就我们而言,我们的羊不是通过一座桥来编组的,而是通过狭窄而不稳定的线圈和山体滑坡来编组的。每个转弯处的网络传输设备都存储一份编组羊的副本,以确保它们能够在任何羊从峡谷中跌落时重新发送副本。

消化的货物无论如何都不能反序列化,这取决于情况食物最初是什么。我的狗也能做到这一点:)我的狗也吃系列化的食物。啊。有一种理论认为狗有时会吃连续的食物。原因是它们的肠道很短,所以当狗吃自己的系列食物时,它的消化道会延长两倍。当它吃到另一种哺乳动物(如马)的食物时,它借用了马的消化系统,因为它不能像马或牛那样有效地处理草纤维。谢谢。有道理。因此,任何未实现Serializable的会话作用域对象要么本身未维护状态,要么在未共享状态的负载平衡服务器上运行?只要对象未实现Serializable,无论其维护何种状态,对象都将无法序列化,因此如果我正确理解您的问题,答案是,放入会话中的任何未实现可序列化的对象实际上都没有被容器序列化,因此您没有看到问题。@Yishai抱歉。我还是不明白。对于一个会话对象,我们得到异常,而对于其他会话对象,则得到异常,那么这两个对象之间的差异是什么?或者他们如何/为什么受到不同对待?在这里,对对象进行状态维护是什么意思?我认为您不需要实现Serialized to,就可以通过一条线将XML或JSON marhsalling解组。对于二进制格式,您需要它—例如在RMI中。但我认为主要原因是这些DTO是HTTP会话的一部分,因此必须根据servlet规范进行序列化。