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!

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #556 (Div. 1)

Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大。 发现只有\(2\)是偶质数,那么我们先放一个\(2\),再放一个\(1\),接下来把\(2\)全部放掉再…

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏,游戏难度很适中,冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式,场景高低落差的设计,整个画面层次感设计算是一级,喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道,要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码,然后扫码获取用户基本信息的,所以我们可以在网站上用这两种方式开发网站的扫码登录,也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序(例如,面向Web或面向服务的)都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件,其中包含运行时所需的所有库和应用程序级依赖…

JavaFX自定义控件– Nest Thermostat第3部分

嗨,经过与同事的讨论,我今天决定展示css方法不是唯一可用于创建自定义控件的方法。 当然,它允许提供一些外观扩展点,但是可以使用代码API使用相同的方法(与向JavaFX的转换)一起使用。 这是图形初始化方法&…

ceph rgw java_ceph rgw multisite基本用法

Realm: Zonegroup: 理解为数据中心,由一个或多个Zone组成,每个Realm有且仅有 一个Master Zonegroup,用于处理系统变更,其他的称为Slave Zonegroup,元数据与Master Zonegroup保持一致&#xff1b…

Python基础-Hello Word!

老师说,学习语言一定要有仪式感,So... print (“Hello Word”) 哈哈,好牛叉! 一、 Python安装 Windows 1、 下载安装包 https://www.python.org/downloads/ 2、 安装 默认安装路径: C:\Users\admin\AppData\Local\Programs\Python…

微信小程序 request请求封装

request 只用 POST,只封装了 POST,等有用到 GET再重写,接口用的 ThinkPHP5.0主要代码 var apiurl "xxxxx"; function http_post(controller,data,cb){wx.request({url:apiurl controller,data:data,method:post,header:{Content-…

MySQL基本语句

MySQL基本语句 数据库语句介绍: 语言分类: DDL:数据库和表 DML:表中的数据 DQL:查询表中的数据 DCL:(授权) DDL: 1、操作数据库 创建数据库: create database 数据库名; 创建数据库,…

使用Java注解不正确的方法

几乎没有什么Deprecated没有适当的文档看到Deprecated方法更令人生气的了。 我感到失落。 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她添加了弃用注释。 我应该使用其他东西吗? 所以…。 使用Deprecated的规则是什…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介:Easypanel是一款虚拟主机管理工具,它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装,是一款集虚拟主机、ftp、mysql等功能为一体的管理系统,本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码,看谁聪明“爱死他”。 密文:766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意:(1)此题由正心41上课的同学做 (2)第一个提交,答案&#xff1a…

html-字体属性

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;}/*font-family 字体类型浏览器默认的字体是微软雅黑&#xff0c;字体中有多个字体的时候&…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…

我喜欢构建器模式的三个原因

有三种方法可以用Java编程语言创建新对象&#xff1a; 伸缩构造函数&#xff08;反&#xff09;模式 Javabeans模式 建造者模式 与其他两种方法相比&#xff0c;我更喜欢使用构建器模式。 为什么&#xff1f; Joshua Bloch描述了构建器模式以及在Effective Java中使用它的…

表单php跳转页面跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

.NetCore模拟Postman的BasicAuth生成Authrization

一、思路 BasicAuth 是一种简单权限&#xff0c;传输UserName<userName>,Password<password> 1.用:连接Username,Password 2.进行Base64编码 3."Basic空格"拼接 二、代码示例 string authorization $"{userName}:{password}"; var authorizat…

Vue项目页面跳转时候的,浏览器窗口上方的进度条显示

1.安装&#xff1a; cnpm install --save nprogress 2.在main.js中引入&#xff1a; 1 import NProgress from nprogress 2 import nprogress/nprogress.css 3.在main.js中进行配置&#xff1a; 1 NProgress.configure({ 2 easing: ease, // 动画方式 3 spee…

使用Spring跟踪应用程序异常

几周前&#xff0c;一位同事要求我花一个星期的时间做后援&#xff0c;因为他需要一个掩护&#xff0c;而他度过了一个赚钱的假期&#xff0c;而他找不到其他人。 当我刚完成一个特别复杂的编码项目并感到有些疲倦时&#xff0c;我说“是”。 毕竟&#xff0c;改变对我有好处。…

php redis.dll php5.6,在Windows 64位下为PHP5.6.14安装redis扩展

一.php安装redis扩展1.使用phpinfo()查看当前版本的信息2.根据PHP版本号&#xff0c;编译器版本号和CPU架构选择php_redis-2.2.5-5.6-nts-vc11-x64.zip和php_igbinary-1.2.1-5.5-nts-vc11-x64.zip下载地址&#xff1a;http://windows.php.net/downloads/pecl/snaps/redis/2.2.5…