本文首发于 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. OBDII Interface Project Source Code

    http://www.oocities.org/sstandfast/OBDII.htm 1 // File: VPWM.jal // Author: Shawn Standfast // Versi ...

  2. ASP.NET WebAPI数据传输安全HTTPS实战项目演练

    一.课程介绍 HTTPS是互联网 Web 大势所趋,各大网站都已陆续部署了 HTTPS .  全站HTTPS时代,加密用户与网站间的交互访问,在客户端浏览器和Web服务器之间建立安全加密通道,一般情况 ...

  3. delphi button 实现下拉列表

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. 对图片进行透明化处理-使用java程序

    因需要将一张白色背景图片处理为透明色,因此上网上搜了搜处理方案,可以通过ps,和美图秀秀,但是我电脑上并没有这两个软件,下载安装太耗时.从网上搜了搜发现原来可以使用java代码进行处理,代码如下: i ...

  5. Asp.net的HttpContext.Current.Items详解

    之前asp.net只是在使用Session来进行用户会话时的信息存储,甚至很少留意Session完整的类调用是HttpContext.Current.Sessoin.... 好吧,我还是处于只会固定写 ...

  6. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  7. 使用viewport中的vm来适配移动端页面

    前言 作为一个小前端,经常要和H5打交道,这就面临着不同终端的适配问题. Flexible方案通过Hack手段来根据设备的dpr值相应改变<meta>标签中viewport的值,给我更贴切 ...

  8. 物联网全景动态图谱2.0|PaaS物联网平台汇总(上篇)

    物联网智库 原创 物联网智库 整理发布 转载请注明来源和出处 ------   [导读]   ------ 毫无疑问,2018年物联网对行业的深度变革才刚刚开启. 物联网产业链企业的质与量将进入全面爆 ...

  9. PHP会员找回密码功能实现实例介绍

    设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3. ...

  10. mysql查询前几条记录

    #My SQL 取前多少条select * from table LIMIT 5,10; #返回第6-15行数据 select * from table LIMIT 5; #返回前5行 select ...