如何查看未声明serialVersionUID的Java类中JVM自动生成的serialVersionUID值

Torreson 2017-03-01 04:35:49
Java类实现了Serializable接口,当没有显示声明serialVersionUID的情况下,当序列化的时候,serialVersionUID由JVM的运行环境决定。
那么我已经把没有声明serialVersionUID的类发布到线上,怎样才能查看这个自动生成的serialVersionUID是多少?

...全文
799 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torreson 2017-03-13
  • 打赏
  • 举报
回复
// 使用serialver 命令查看
oO临时工Oo 2017-03-01
  • 打赏
  • 举报
回复
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 -- serialVersionUID 字段作为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。

以上引用自JDK说明文档。

要想知道JVM给对象默认的serialVersionUID值是什么,需要new一个支持序列化对象,并将对象写入文件,通过查看文件二进制编码来找到默认的serialVersionUID,以下提供将对象写入文件的代码参考


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class XX implements Serializable {

/**
*
*/
// private static final long serialVersionUID = 555555555;
public int i = 10;
public String str0 = "str--";

public void x() {
String s;

System.out.println("call x()");
}

public static void main(String[] args) {

System.out.println(0x211d1ae3);
System.out.println(0x4bf32ddea2e77b02l);

XX x = new XX();
writeObjectToFile(x);

}

public static void writeObjectToFile(Object obj) {
File file = new File("c:\\test1.dat");
FileOutputStream out;
try {
out = new FileOutputStream(file);
ObjectOutputStream objOut = new ObjectOutputStream(out);
objOut.writeObject(obj);
objOut.flush();
objOut.close();
System.out.println("write object success!");
} catch (IOException e) {
System.out.println("write object failed");
e.printStackTrace();
}
}

}


指定serialVersionUID和不指定serialVersionUID时,分别把对象写入两个不同的文件test1.dat和test2.dat,通过winhex查看两个文件的二进制编码,找到不同的地方。如下图所示,

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧