我在一篇文章中读到,默认的serialVersionUid是JVM提供的对象的哈希码。如果我们没有在类中重写哈希码方法,那么在反序列化期间哈希码将如何被计算呢?因为通常哈希码是对象的内存地址。
我在一篇文章中读到,默认的serialVersionUid是JVM提供的对象的哈希码。如果我们没有在类中重写哈希码方法,那么在反序列化期间哈希码将如何被计算呢?因为通常哈希码是对象的内存地址。
serialVersionUid
是一个对象的哈希值。long
。hashcode
,serialVersionUid
是静态变量,而hashcode
是实例方法,对象的hashcode值因对象而异。
serialVersionUid
是根据类的结构(字段、方法等)计算的。它在http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html中有说明,http://download.oracle.com/javase/6/docs/platform/serialization/spec/class.html#4100描述了确切的格式。类名。
以32位整数表示的类修饰符。
按名称排序的每个接口的名称。
按字段名称排序的每个字段(除了私有静态和私有瞬态字段):
如果存在类初始化程序,请写出以下内容:
按方法名称和签名排序的每个非私有构造函数:
按方法名称和签名排序的每个非私有方法:
long hash
= ((sha[0] >>> 24) & 0xFF) |
((sha[0] >>> 16) & 0xFF) << 8 |
((sha[0] >>> 8) & 0xFF) << 16 |
((sha[0] >>> 0) & 0xFF) << 24 |
((sha[1] >>> 24) & 0xFF) << 32 |
((sha[1] >>> 16) & 0xFF) << 40 |
((sha[1] >>> 8) & 0xFF) << 48 |
((sha[1] >>> 0) & 0xFF) << 56;
long hash
不是指 hashcode
。
serialver
,以查看默认情况下该代码会是什么(默认情况下只是对象的哈希码)。" - beatngu13