对象编组和解组是什么意思?上述操作发生时对对象状态有什么影响,即序列化对hashCode
和equals
的影响?
答案 0 :(得分:44)
marshall 对象是将其转换为适合序列化存储或传输的形式;也就是说,将它从JVM内存中的原生形式转换为可以通过线路发送,插入文件/数据库等的形式。具体情况将根据所涉及的编组形式而有所不同; Java的默认序列化机制是一种方法,但将对象转换为XML或JSON表示同样有效。
解组只是这个过程的反面/另一面;表示由编组创建的对象,并使用它来重构JVM中的对象实例。
说实话,我不确定你问题的其他部分究竟是什么意思。原始对象通常不会被编组改变(这在概念上是一种只读操作,就像复制一样)。所以它的哈希码等会保持不变。
根据定义,对象的未编组副本将具有与原始对象相同的逻辑状态(毕竟,这是编组的重点,以便能够重现等效对象)。因此,在这方面,它的状态,即其字段的值是相同的。但是,如果哈希码取决于环境因素 - 例如机器的主机名或存储实例的内存地址 - 那么它当然可以报告不同的内容。这与默认的Object.hashCode()
实现特别相关,其中对象的内存位置很重要。 (但是这与编组无关;在同一个JVM中以任何方式获取对象的“完美副本”在这种情况下仍然会导致不同的哈希码。)
答案 1 :(得分:33)
编组是指生成一个包含足够信息的字节流,以便能够重新构建对象。
这对原始对象没有影响,它是一个只读操作。解组导致创建另一个不相关的对象(通常)。
该副本可能具有相同的hashCode()
并且为equals() == true
和compareTo() == 0
(假设其可比较)。
答案 2 :(得分:0)
在C ++中,如果你通常从存储对象的内存块中创建哈希码,那么在未编组的对象中它可能会有所不同。
第一个指针值不同。由于系统加载器重定位二进制文件,第二个the vtbl pointer是不同的。
答案 3 :(得分:0)
Marshaling与序列化几乎相同。差异(在Java上下文中)在远程对象处理中,如rfc2713中所指定。
至于哈希码值:它取决于对象如何计算其哈希码。如果它仅根据字段计算,则显然与未编组的对象相等与原始对象相同。但是如果它使用Object
的原始hashCode
,那么它就是JVM碰巧给予该对象的任何东西,并且因实例而异。
答案 4 :(得分:0)
用于保存对象或将它们发送到另一个对象,例如Java世界中的VM。 如果您已整理所有信息,则在编组之后将重建该对象。
例如,您可以标记字段,以便它们在序列化中丢失,然后您无法完全重新创建对象。
很可能状态丢失,这也是因为您通常不会序列化状态,而只会序列化bean所持有的数据。例如,您序列化字段地址。你没有序列化状态“当前正在看对象的2人”。
答案 5 :(得分:-3)
编组正在将对象中存在的数据转换为xml格式并以xml格式查看,并且解组与将xml文件转换为对象相反