JDK自带servialver工具使用
对于实现了serializable
接口的类,可以被java序列化和反序列化,序列化操作时用来判断该类是否有变化的标志就是serialVersionUID
,serialVersionUID
可以说是类的版本号,如果反序列化操作时,类的serialVersionUID
版本号与序列化时不同,则会抛出SerializationFailedException
异常,同时显示出两次serialVersionUID
的具体信息,所以 serialVersionUID
在序列化中是极为重要的信息
serialver
命令是JDK提供的用来查看类serialVersionUID
的工具,命令如下:
serialver [-classpath classpath] [-show] [classname...]
-classpath 参数项是用指类路径,当要查找的类在jar包中,类路径是指jar包
的相对路径或者绝对路径,当要查找的类.class
在系统的某个文件路径下时,类路径是指.class
文件包名的开始位置
的相对路径或者绝对路径
-
jar包方式
-
jar包物理路径:
/Users/xiao/Documents/study/test.jar
,需要显示serialVersionUID
的类com.test.BaseEntity
当前目录:
/Users/xiao/Documents
,命令如下serialver -classpath ./study/test.jar com.test.BaseEntity
serialver -classpath /Users/xiao/Documents/study/test.jar com.test.BaseEntity
文件目录方式
-
类路径:
/Users/xiao/Documents/study/com/test/BaseEntity.class
当前目录:
/Users/xiao/Documents
,命令如下:serialver -classpath ./study com.test.BaseEntity
serialver -classpath /Users/xiao/Documents/study com.test.BaseEntity
当前目录:
/Users/xiao/Documents/study
,命令如下:serialver -classpath ./ com.test.BaseEntity
serialver -classpath com.test.BaseEntity
serialver -classpath /Users/xiao/Documents/study com.test.BaseEntity
当前目录:
/Users/xiao/Documents/study/com/test
,命令如下:serialver -classpath ../../ com.test.BaseEntity
serialver -classpath /Users/xiao/Documents/study com.test.BaseEntity
如果直接跑到类的直接目录(/Users/xiao/Documents/study/com/test/
)下,classpath 不正确虽然能找到对应的类,但是会抛出,执行如下命令:
serialver com.test.BaseEntity
结果如下:
找不到类BaseEntity
执行如下命令:
serialver BaseEntity
结果如下:
Exception in thread "main" java.lang.NoClassDefFoundError: BaseEntity (wrong name: com/test/BaseEntity)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at sun.tools.serialver.SerialVer.resolveClass(SerialVer.java:211)
at sun.tools.serialver.SerialVer.serialSyntax(SerialVer.java:183)
at sun.tools.serialver.SerialVer.main(SerialVer.java:297)