对象编码和解码是什么意思?上述操作发生时对对象状态有什么影响,即序列化对hashCode
和equals
的影响?
最佳答案
marshall一个对象,就是把它转换成适合序列化存储或传输的形式;也就是说,将其从 JVM 内存中的 native 形式转换为可以通过线路发送、插入文件/数据库等的形式。具体情况将根据所涉及的编码形式而有所不同; Java 的默认序列化机制是一种方式,但将对象转换为 XML 或 JSON 表示同样有效。
解码只是这个过程的反面/另一面;获取通过编码创建的对象的表示,并使用它在 JVM 中重构对象实例。
老实说,我不确定您问题的另一部分究竟是什么意思。原始对象通常不会通过编码更改(这在概念上是只读操作,例如获取副本)。所以它的hashcode等保持不变。
根据定义,对象的未编码副本将具有与原始对象相同的逻辑状态(毕竟这是编码的要点,以便能够复制等效对象)。所以在这方面它的状态,即它的字段的值,是相同的。但是,如果哈希码取决于环境因素——例如机器的主机名,或者存储实例的内存地址——那么它当然可能会报告不同的内容。这与默认的 Object.hashCode()
实现特别相关,其中对象的内存位置很重要。 (但这与编码无关;在这种情况下,以任何方式在同一 JVM 中获取对象的“完美副本”仍然会导致不同的哈希码。)
关于java - 编码和未编码的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7255180/