Java:计算类的serialVersionUID
在本周早些时候,我想计算可序列化类的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!
翻译自: https://www.javacodegeeks.com/2014/02/java-work-out-the-serialversionuid-of-a-class.html
Java:计算类的serialVersionUID相关推荐
- java类中serialversionuid 作用 是什么?举个例子说明
转自https://www.cnblogs.com/duanxz/p/3511695.html serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的 ...
- Java计算时间差_传统的SimpleDateFormat类
Java计算时间差_传统的SimpleDateFormat类 SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd ...
- 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成...
写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...
- Java—计算长方形的周长和面积(类和对象)
Java-计算长方形的周长和面积(类和对象) Description 设计一个长方形类Rect,计算长方形的周长与面积. 成员变量:整型.私有的数据成员length(长).width(宽): 构造方法 ...
- java编写计算类加减乘除_老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java...
导航:网站首页 > 老师要求张浩使用面向对象的思想编写一个计算器类(Calculator),可以实现两个整数的加减乘除的运算.java 时间:2019-4-10 老师要求张浩使用面向对象的思想编 ...
- Java计算日期时间差的工具类总结
目录 1. 概述 2. 使用案例 2.1 SimpleDateFormat 2.2 ChronoUnit 2.3 Duration 2.4 Calendar 2.5 Period 1. 概述 最近需要 ...
- java_version干什么的_java类中serialVersionUID的作用及其使用
实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署提供先决条件.若没有序列化,现在我们所熟悉的远程调用,对象数据库都不可能存在, serialVer ...
- JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)
1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动 ...
- 【Java系列】从JVM角度解析Java核心类String的不可变特性
凯伦说,公众号ID: KailunTalk,努力写出最优质的技术文章,欢迎关注探讨. 1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设 ...
最新文章
- springboot-mysql-pagehelper分页插件集成
- 微信自定义内置返回事件
- 三十一、Java多线程编程(下篇)
- linux系统利用wifi上网,【教程】Wii安装运行可用WIFI的Linux系统全攻略
- LeetCode 542 01 矩阵
- DirectX 9 学习笔记
- 如何批量更改Mac视频帧速率
- 6421B Lab11 为分支机构优化数据访问
- 信息系统项目管理师快速记忆口诀
- 剑英陪你玩转图形学(一)打通任督二脉
- 【数学】求一类数列的通项公式
- fcpx插件:FilmConvert Pro for Mac(数字转胶片调色插件)
- 按计算机应用领域分类 情报检索系统属于,2014年高职单招计算机类模拟试卷一(环职职专)...
- [python]的functools.partial(偏函数)
- 无力吐槽的 create-shortcut .exe
- Apache Spark【从无到有从有到无】【编程指南】【AS5】结构化流编程指南
- 快手Y-tech:GAN在短视频中的AI特效实践
- Ceph学习——Librbd块存储库与RBD读写流程源码分析
- 什么是swift闭包?
- 对比两张图片的MD5值
热门文章
- 服务器登陆显示其他用户,连接远程服务器显示其他用户
- linux软件可以在所有发行版运行吗,Linux通用的跨发行版的3大软件包管理器
- antd vue表单上传文件_vue+axios+antD的上传图片踩坑
- ROC和AUC介绍以及如何计算AUC
- cognito_将Spring Boot应用程序与Amazon Cognito集成
- =空值返回空值_@ParameterizedTest在@CvsSource中具有空值
- junit测试找不到数据库_将数据库日志添加到JUnit3
- java替换数组中的元素_如何使用Java 8流快速替换列表中的元素
- jax-rs jax-ws_在JAX-RS中使用@Context [第1部分]
- java ee jsp_EE JSP:使用自定义标签库生成动态内容