Java 已编组和未编组的对象

Java 已编组和未编组的对象,java,Java,对象封送和解封送是什么意思?当上述操作发生时,对对象状态的影响是什么,即序列化对hashCode和的影响等于?编组意味着生成一个包含足够信息的字节流,以便能够重新构建对象 这对原始对象没有影响,它是一个只读操作。解组导致创建另一个不相关的对象(通常) 副本可能具有相同的hashCode(),并且是equals()==true和compareTo()==0(假设其具有可比性)。到marshall一个对象是将其转换为适合串行存储或传输的形式;也就是说,将其从JVM内存中的本机形式转换为可以通过线路发

对象封送和解封送是什么意思?当上述操作发生时,对对象状态的影响是什么,即序列化对
hashCode
的影响等于

编组意味着生成一个包含足够信息的字节流,以便能够重新构建对象

这对原始对象没有影响,它是一个只读操作。解组导致创建另一个不相关的对象(通常)


副本可能具有相同的
hashCode()
,并且是
equals()==true
compareTo()==0
(假设其具有可比性)。

marshall一个对象是将其转换为适合串行存储或传输的形式;也就是说,将其从JVM内存中的本机形式转换为可以通过线路发送、插入文件/数据库等的形式。具体情况将根据所涉及的编组形式而有所不同;Java的默认序列化机制是一种方式,但将对象转换为XML或JSON表示形式同样有效

解组正是这个过程的反面/另一面;获取通过编组创建的对象的表示形式,并使用它在JVM中重建对象实例


老实说,我不确定你问题的另一部分到底是什么意思。通常,编组不会更改原始对象(从概念上讲,编组是一种只读操作,如复制)。所以它的hashcode等将保持不变


根据定义,对象的非编组副本将具有与原始对象相同的逻辑状态(这毕竟是编组的要点,以便能够复制等效对象)。因此,在这方面,它的状态,即它的字段的值,是相同的。但是,如果hashcode取决于环境因素,例如机器的主机名或实例存储的内存地址,那么它当然可能会报告一些不同的情况。这与默认的
Object.hashCode()
实现特别相关,对象的内存位置很重要。(但这与编组无关,在同一个JVM中采用一种“完美拷贝”的方法,在这种情况下仍然会导致不同的哈希代码。)C++中的

< P>,如果从存储对象的内存块中一般地生成哈希代码,在未编组的对象中可能会不同。


第一个指针值不同。第二个是不同的,因为系统加载器重新定位了二进制文件。

封送与序列化几乎相同。区别(在Java上下文中)在于远程对象处理,如中所述


至于散列码值:它取决于对象如何计算其散列码。如果它仅从字段计算,那么它显然与取消编组的对象等于原始对象相同。但是如果它使用
对象
的原始
hashCode
,那么它就是JVM给予该对象的任何东西,并且会因实例而异。

它用于保存对象或将对象发送到Java世界中的另一个VM,例如VM。 如果您已封送了所有信息,封送后将重新构造相同的对象

例如,您可以标记字段,使其在序列化过程中丢失,然后无法完全重新创建对象


最有可能状态丢失了,这也是由于您通常不序列化状态,而只序列化bean所持有的数据。e、 g序列化字段地址。您不会序列化状态“2个人当前正在查看对象”。

编组是将对象中的数据转换为xml格式,并以xml格式查看,而解编组是将xml文件转换为对象的相反过程

,但我在编组时听到,计算代码如equals,不包括hashcode。是这样吗,Peter?代码(类文件)本身不包括在内,只有足够的状态(取决于对象)来重建对象。解组后可以重新计算这些状态。通常,只发送原始数据,不发送派生值。(尽管可以,如果您愿意的话)通常也不发送代码,但是JavaRMI也支持这样做。i、 例如,你可以将一个对象发送到另一个没有该类代码的系统,它可以工作。因此,基本上与序列化/反序列化的含义完全相同。外部格式可以是XML,也可以是其他格式。当进行RMI时,则是另一个“外部”java中的format.marshalling和unmarshalling可以通过jaxb概念来实现,jaxb是java体系结构xml绑定,它告诉我们如何将java对象转换为xml格式,我对RMI的另一种外部格式一无所知。如果您愿意分享任何关于此的信息,我想知道它。谢谢解释性回答