本文首发于 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 的用处在这里的更多相关文章

  1. Java基础--serialVersionUID

    Java基础--serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比 ...

  2. Java中serialVersionUID的解释及两种生成方式的区别(转载)

    转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版 ...

  3. JAVA中SERIALVERSIONUID的解释

    serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private st ...

  4. Java中serialVersionUID

    报错信息如下: Adds a default serial version ID to the selected type. Use this option to add a user-defined ...

  5. 【java】serialVersionUID作用

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  6. java 序列化 serialVersionUID 的作用 和 两种添加方式

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  7. Q:java中serialVersionUID的作用

    @转载自:http://www.cnblogs.com/guanghuiqq/archive/2012/07/18/2597036.html   简单来说,Java的序列化机制是通过在运行时判断类的s ...

  8. java 实现serialVersionUID

    文章转自  https://www.cnblogs.com/duanxz/p/3511695.html 作用 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制 ...

  9. Java 基础 - java序列化 & serialVersionUID

    ref: https://www.cnblogs.com/duanxz/p/3511695.html ------------------- SerialVersionUID概述 SerialVers ...

随机推荐

  1. elasticsearch服务安装采坑

    笔者这里下载的elastic search,是5.3.0版本,下载地址:https://www.elastic.co/downloads/past-releases/elasticsearch-5-3 ...

  2. elastic-job详解(二):作业的调度

    JobScheduler是elastic-job作业调度的关键类,也是起始类,在包com.dangdang.ddframe.job.lite.api下.调度任务的执行需要包含两大步骤:任务的配置和任务 ...

  3. poj3280 Cheapest Palindrome(回文串区间dp)

    https://vjudge.net/problem/POJ-3280 猛刷简单dp第一天第三题. 这个据说是[求字符串通过增减操作变成回文串的最小改动次数]的变体. 首先增减操作的实质是一样的,所以 ...

  4. 异常处理汇总 ~ 修正果带着你的Code飞奔吧!

    异常处理汇总-运维系列 http://www.cnblogs.com/dunitian/p/4522983.html 异常处理汇总-开发工具  http://www.cnblogs.com/dunit ...

  5. C# 枚举类型 enum

    我个人感觉平日用到的enum应该是非常简单的,无非就是枚举和整数.字符串之间的转换.最近工作发现一些同事居然不太会用这个东东,于是就整理一下. 枚举类型是定义了一组“符号名称/值”配对.枚举类型是强类 ...

  6. 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt= ...

  7. 终端下将 man 命令的结果输出到文件保存

    终端下将 man 命令的结果输出到文件保存 在linux或mac下,当我们使用man命令查看某一个命令的详细帮助说明信息时: 可能终端的显示效果不是那么方便: 那么我们可以将man命令的结果输出到tx ...

  8. Nginx 反向代理504 Gateway Time-out

    location /ssfwpt { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_ ...

  9. SpringBoot2.0针对请求参数@RequestBody验证统一拦截

    title: "SpringBoot2.0针对请求参数@RequestBody验证的统一拦截"categories: SpringBoot2.0 Shirotags: Spring ...

  10. IFNULL和isnull用法

    语法 ISNULL ( check_expression , replacement_value ) 参数 check_expression: 将被检查是否为 NULL的表达式.check_expre ...