Java | 原来 serialVersionUID 的用处在这里
本文首发于 http://youngzy.com/
一直不太明白Java对象里 serialVersionUID 字段是做什么用的。
有或者没有,它们之间有差别吗?除了Eclipse里提示的那个黄色的警告。
今天终于知道,原来是在对象序列化这块有作用。
看个例子。
有这样一个对象 User:
class User implements Serializable {
String username;
int age;
String gender;
Date regDay;
boolean martialStatus;
@Override
public String toString() {
return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
+ ", martialStatus=" + martialStatus + "]";
}
}
现在将这个对象序列化存储到硬盘上:
public void testWriteObject() {
User user = new User();
user.username = "Jack";
user.password = "1234567";
user.age = 20;
user.gender = "male";
user.regDay = new Date();
user.martialStatus = false;
// 文件的后缀名不影响,无论是 txt,io,甚至是没有后缀
ObjectSerialize.writeObject(user, "d:\\tmp\\obj");
}
注: ObjectSerialize 是笔者自己封装的简单的对对象序列化存取的工具类。
下同。
从对应的文件中读取对象信息:
public void testReadObject() {
User user = (User) ObjectSerialize.readObject("d:\\tmp\\obj");
System.out.println(user);
}
目前为止都是正常的。能够存储对象,也能够正确地读取对象信息。
假如,User对象又新增了一个国籍(nationality)字段,新的User类如下(主要差别是在第 8 行的新增字段):
class User implements Serializable {
String username;
int age;
String gender;
Date regDay;
boolean martialStatus;
String nationality; // 新增的字段
@Override
public String toString() {
return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
+ ", martialStatus=" + martialStatus + ", nationality=" + nationality + "]";
}
这个时候再去读区原来的对象文件,你会得到一个异常信息:
java.io.InvalidClassException: org.young.elearn.io.User; local class incompatible: stream classdesc serialVersionUID = 7967476135812239100, local class serialVersionUID = 905986497687499238
serialVersionUID 的问题!!!
文件里存储的User对象的 serialVersionUID 跟当前的User对象(User.class)的 serialVersionUID 不一致。因为如果一个Java对象没有指定 serialVersionUID ,那么系统(JVM)动态地指定一个。
为了解决这个问题,只要在定义User对象时指定 serialVersionUID 就可以了,即:
class User implements Serializable {
private static final long serialVersionUID = 7967476135812239100L;
// same code as before
}
详细的代码可参考:GitHub
Java | 原来 serialVersionUID 的用处在这里的更多相关文章
- Java基础--serialVersionUID
Java基础--serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比 ...
- Java中serialVersionUID的解释及两种生成方式的区别(转载)
转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用: 序列化时为了保持版 ...
- JAVA中SERIALVERSIONUID的解释
serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比如:private st ...
- Java中serialVersionUID
报错信息如下: Adds a default serial version ID to the selected type. Use this option to add a user-defined ...
- 【java】serialVersionUID作用
serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...
- java 序列化 serialVersionUID 的作用 和 两种添加方式
serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...
- Q:java中serialVersionUID的作用
@转载自:http://www.cnblogs.com/guanghuiqq/archive/2012/07/18/2597036.html 简单来说,Java的序列化机制是通过在运行时判断类的s ...
- java 实现serialVersionUID
文章转自 https://www.cnblogs.com/duanxz/p/3511695.html 作用 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制 ...
- Java 基础 - java序列化 & serialVersionUID
ref: https://www.cnblogs.com/duanxz/p/3511695.html ------------------- SerialVersionUID概述 SerialVers ...
随机推荐
- 匈牙利算法--java
先上例题 杭电acm 2063 :http://acm.hdu.edu.cn/showproblem.php?pid=2063 bool 寻找从k出发的对应项出的可增广路 { while (从邻接表中 ...
- python之继承与派生
1 继承 继承的概念:继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承 继 ...
- HTML5 学习08——Input 类型、表单元素及属性
注意:并不是所有的主流浏览器都支持新的input类型,不过您已经可以在所有主流的浏览器中使用它们了.即使不被支持,仍然可以显示为常规的文本域. (1)Input 类型: color color 类型: ...
- mybatis foreach中collection的三种用法
原文:https://www.cnblogs.com/xiemingjun/p/9800999.html foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach ...
- 资源贴——以备时时查询用
目录区 AI教程 AI教程 1.AI教程!教你绘制小清新巴士 2.AI教程!如何使用基础图形来绘制消防插画 3.AI教程!教你绘制秋日插画 4.AI教程!教你制作色彩分明的街边场景插画 ...
- 为RecyclerView打造通用Adapter
##RecycleView简单介绍 RecyclerView控件和ListView的原理有非常多相似的地方,都是维护少量的View来进行显示大量的数据.只是RecyclerView控件比ListVie ...
- 【Docker江湖】之docker部署与理解
转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...
- Linux下清理内存和Cache方法见下文:
暂时目前的环境处理方法比较简单: 在root用户下添加计划任务: */10 * * * * sync;echo 3 > /proc/sys/vm/drop_caches; 每十分钟执行一次,先将 ...
- Jexus 5.4.6 on CentOS 6.6
Mono 通过脚本安装 https://github.com/cjy37/linux-asp.net-installScript 版本 3.10 MongoDB 也可通过以上脚本安装 默认端口 270 ...
- 【PHP】解析PHP中的数组
目录结构: contents structure [-] 创建数组 删除数组 栈结构 常用的数组处理函数 在这篇文章中,笔者将会介绍PHP中数组的使用,以及一些注意事项.之前笔者已经说过PHP是一门弱 ...