西安小公司网站建设,WordPress文章文字改颜色,国外的电商网站有哪些,福州seo按天收费serialVersionUID简要介绍serialVersionUID是在Java序列化、反序列化对象时起作用的一个字段。Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时#xff0c;JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进…serialVersionUID简要介绍serialVersionUID是在Java序列化、反序列化对象时起作用的一个字段。Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较如果相同就认为是一致的可以进行反序列化否则就会出现序列化版本不一致的异常即是InvalidClassException。序列化是一种把对象持久化到外部的手段。在网络传输等场景中应用广泛如Dubbo等框架。类通过实现 java.io.Serializable 接口以启用其序列化功能。阿里Java规约中的描述阿里规约中强制性的提醒修改serialVersionUID字段会引起反序列化失败的情况。代码演示下面通过实际代码来演示对象序列化、反序列化的操作。引入依赖org.apache.commons commons-lang3 3.8.1commons-io commons-io 2.6junit junit 4.12commons-lang3这个包有帮我们实现了序列化的工具类commons-io帮我们实现了文件操作的工具类junit用来写单元测试。序列化有User.class如下DataBuilderpublic class User implements Serializable { private static final long serialVersionUID 1L; private String username;}Data 和 Builder 是Lombok里面的注解可以自动生成getter、setter方法等不懂的可以查看我之前的文章对这个有讲解。需要序列化的类需要实现Serializable接口Serializable是一个标识接口里面没有具体需要实现的东西。序列化代码Testpublic void serializeTest() throws IOException { User user User.builder().username(happyjava).build(); byte[] serialize SerializationUtils.serialize(user); FileUtils.writeByteArrayToFile(new File(serialize.txt), serialize);}SerializationUtils是commons-lang3包给我们提供的工具类它给我们提供了序列化和反序列化的方法我们直接拿过来用就好了。 FileUtils是commons-io包给我们提供的工具类它给我们提供了非常丰富的IO操作工具类。执行方法后查看serialize.txt这就是序列化后保存到外部的对象了。我们可以把它反序列化成为对象。反序列化反序列化代码如下Testpublic void deserializeTest() throws IOException { byte[] bytes FileUtils.readFileToByteArray(new File(serialize.txt)); Object object SerializationUtils.deserialize(bytes); System.out.println(object instanceof User); User user (User)object; System.out.println(user.getUsername());}这里使用FileUtils把外部的文件读入使用SerializationUtils反序列化成为对象。然后判断反序列化后对象的类型强转为User后输出其username运行结果如下说明反序列化已经成功过了修改serialVersionUID值使反序列化异常现在把User的serialVersionUID值做一下修改DataBuilderpublic class User implements Serializable { private static final long serialVersionUID 2L; private String username;}之前是1现在改为2再次执行反序列化方法结果如下这里出现了开头提到的InvalidClassException异常并且通过异常信息可以看到这是serialVersionUID不一致引起的。org.apache.commons.lang3.SerializationException: java.io.InvalidClassException: cn.happy.User; local class incompatible: stream classdesc serialVersionUID 1, local class serialVersionUID 2总结通过理论和代码演示我们已经知道了serialVersionUID字段可以造成反序列化失败的情况。所以在做系统升级的时候需要充分考虑是否要改动serialVersionUID的值因为这会引起兼容性的问题。