在本周早些时候,我想计算可序列化类的serialVersionUID ,以便可以覆盖其toString方法而不会破坏所有内容。

我遇到了Frank Kim的博客文章 ,该文章建议使用JDK附带的serialver工具。

我创建了一个Maven小项目来在一个非常简单的类上测试该工具:

import java.io.Serializable;public class SerialiseMe implements Serializable
{}

如果我们将该类编译为一个JAR,然后运行serialver工具,则会看到以下输出:

$ serialver -classpath target/serialiser-0.0.1-SNAPSHOT.jar SerialiseMe
SerialiseMe:    static final long serialVersionUID = -6060222249255158490L;

我想快速确认我可以使用该值对这个类进行序列化和反序列化,因此我编写了以下代码来对该类进行序列化(当它没有串行版本的UID时):

public class Serialiser
{public static void main( String[] args ) throws IOException, ClassNotFoundException{ByteArrayOutputStream bout = new ByteArrayOutputStream(  );ObjectOutputStream oout = new ObjectOutputStream( bout );Object value = new SerialiseMe();oout.writeObject( value );oout.close();byte[] bytes = bout.toByteArray();FileOutputStream fileOuputStream = new FileOutputStream("/tmp/foo.txt");fileOuputStream.write(bytes);fileOuputStream.close();}
}

完成之后,我编写了以下代码来反序列化文件:

public class Deserialiser
{public static void main( String[] args ) throws IOException, ClassNotFoundException{FileInputStream fileInputStream = new FileInputStream( new File( "/tmp/foo.txt" ) );byte[] bytes = IOUtils.toByteArray( fileInputStream );ByteArrayInputStream in = new ByteArrayInputStream( bytes, 0, bytes.length );ObjectInputStream oin = new ObjectInputStream( in );Object object = oin.readObject();}
}

我将串行版本的UID插入到该类中,并能够正确地反序列化它。 我尝试更改一个数字只是为了检查它是否会炸毁,并且确实做到了:

import java.io.Serializable;public class SerialiseMe implements Serializable
{static final long serialVersionUID = -6060222249255158491L;
}
Exception in thread "main" java.io.InvalidClassException: SerialiseMe; local class incompatible: stream classdesc serialVersionUID = -6060222249255158490, local class serialVersionUID = -6060222249255158491at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)at Deserialiser.main(Deserialiser.java:18)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

serialver #ftw!

参考: Java:在Mark Needham博客博客中,从我们的JCG合作伙伴 Mark Needham中计算出一个类的serialVersionUID 。

翻译自: https://www.javacodegeeks.com/2014/02/java-work-out-the-serialversionuid-of-a-class.html

Java:计算类的serialVersionUID相关推荐

  1. java类中serialversionuid 作用 是什么?举个例子说明

    转自https://www.cnblogs.com/duanxz/p/3511695.html serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的 ...

  2. Java计算时间差_传统的SimpleDateFormat类

    Java计算时间差_传统的SimpleDateFormat类 SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd ...

  3. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成...

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  4. Java—计算长方形的周长和面积(类和对象)

    Java-计算长方形的周长和面积(类和对象) Description 设计一个长方形类Rect,计算长方形的周长与面积. 成员变量:整型.私有的数据成员length(长).width(宽): 构造方法 ...

  5. java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...

    导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...

  6. Java计算日期时间差的工具类总结

    目录 1. 概述 2. 使用案例 2.1 SimpleDateFormat 2.2 ChronoUnit 2.3 Duration 2.4 Calendar 2.5 Period 1. 概述 最近需要 ...

  7. java_version干什么的_java类中serialVersionUID的作用及其使用

    实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署提供先决条件.若没有序列化,现在我们所熟悉的远程调用,对象数据库都不可能存在, serialVer ...

  8. JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)

    1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动 ...

  9. 【Java系列】从JVM角度解析Java核心类String的不可变特性

    凯伦说,公众号ID: KailunTalk,努力写出最优质的技术文章,欢迎关注探讨. 1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设 ...

最新文章

  1. springboot-mysql-pagehelper分页插件集成
  2. 微信自定义内置返回事件
  3. 三十一、Java多线程编程(下篇)
  4. linux系统利用wifi上网,【教程】Wii安装运行可用WIFI的Linux系统全攻略
  5. LeetCode 542 01 矩阵
  6. DirectX 9 学习笔记
  7. 如何批量更改Mac视频帧速率
  8. 6421B Lab11 为分支机构优化数据访问
  9. 信息系统项目管理师快速记忆口诀
  10. 剑英陪你玩转图形学(一)打通任督二脉
  11. 【数学】求一类数列的通项公式
  12. fcpx插件:FilmConvert Pro for Mac(数字转胶片调色插件)
  13. 按计算机应用领域分类 情报检索系统属于,2014年高职单招计算机类模拟试卷一(环职职专)...
  14. [python]的functools.partial(偏函数)
  15. 无力吐槽的 create-shortcut .exe
  16. Apache Spark【从无到有从有到无】【编程指南】【AS5】结构化流编程指南
  17. 快手Y-tech:GAN在短视频中的AI特效实践
  18. Ceph学习——Librbd块存储库与RBD读写流程源码分析
  19. 什么是swift闭包?
  20. 对比两张图片的MD5值

热门文章

  1. 服务器登陆显示其他用户,连接远程服务器显示其他用户
  2. linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器
  3. antd vue表单上传文件_vue+axios+antD的上传图片踩坑
  4. ROC和AUC介绍以及如何计算AUC
  5. cognito_将Spring Boot应用程序与Amazon Cognito集成
  6. =空值返回空值_@ParameterizedTest在@CvsSource中具有空值
  7. junit测试找不到数据库_将数据库日志添加到JUnit3
  8. java替换数组中的元素_如何使用Java 8流快速替换列表中的元素
  9. jax-rs jax-ws_在JAX-RS中使用@Context [第1部分]
  10. java ee jsp_EE JSP:使用自定义标签库生成动态内容