Java | 原来 serialVersionUID 的用处在这里

本文首发于 http://youngzy.com/

一直不太明白Java对象里 serialVersionUID 字段是做什么用的。
有或者没有,它们之间有差别吗?除了Eclipse里提示的那个黄色的警告。

今天终于知道,原来是在对象序列化这块有作用。

看个例子。

有这样一个对象 User:

 1 class User implements Serializable {
 2
 3     String username;
 4     int age;
 5     String gender;
 6     Date regDay;
 7     boolean martialStatus;
 8
 9     @Override
10     public String toString() {
11         return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
12                 + ", martialStatus=" + martialStatus + "]";
13     }
14
15 }

现在将这个对象序列化存储到硬盘上:

 1 public void testWriteObject() {
 2     User user = new User();
 3
 4     user.username = "Jack";
 5     user.password = "1234567";
 6     user.age = 20;
 7     user.gender = "male";
 8     user.regDay = new Date();
 9     user.martialStatus = false;
10
11     // 文件的后缀名不影响,无论是 txt,io,甚至是没有后缀
12     ObjectSerialize.writeObject(user, "d:\\tmp\\obj");
13 }

注: ObjectSerialize 是笔者自己封装的简单的对对象序列化存取的工具类。
下同。

从对应的文件中读取对象信息:

1 public void testReadObject() {
2     User user = (User) ObjectSerialize.readObject("d:\\tmp\\obj");
3     System.out.println(user);
4 }

目前为止都是正常的。能够存储对象,也能够正确地读取对象信息。

假如,User对象又新增了一个国籍(nationality)字段,新的User类如下(主要差别是在第 8 行的新增字段):

 1 class User implements Serializable {
 2
 3     String username;
 4     int age;
 5     String gender;
 6     Date regDay;
 7     boolean martialStatus;
 8     String nationality; // 新增的字段
 9
10     @Override
11     public String toString() {
12         return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
13                 + ", martialStatus=" + martialStatus + ", nationality=" + nationality + "]";
14     }
15

这个时候再去读区原来的对象文件,你会得到一个异常信息:

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 就可以了,即:

1 class User implements Serializable {
2
3     private static final long serialVersionUID = 7967476135812239100L;
4
5     // same code as before
6
7 }

详细的代码可参考:GitHub

阅读原文

时间: 2024-10-14 12:43:36

Java | 原来 serialVersionUID 的用处在这里的相关文章

Java中serialVersionUID的解释

Java中serialVersionUID的解释 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:        private static final   long     serialVersionU

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

serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException. serialVersionUID有两种显示的生成方式:        一是默认的1

Java中serialVersionUID

报错信息如下: Adds a default serial version ID to the selected type. Use this option to add a user-defined ID in combination with  custom serialization code if the type did undergo structural  changes since its first release. 推荐两篇文章:http://zengxiankang2011

【java】serialVersionUID作用

serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException. serialVersionUID有两种显示的生成方式:        一是默认的1

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

转载自:http://blog.csdn.net/xuanxiaochuan/article/details/25052057 serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private static final long serialVersionUID = 1L;       一个是根据类名.接口名.成员方法及属性等来生成一个64位的哈希字段,比如:    

Java中serialVersionUID的作用

我们有时需要将一个对象序列化,保存在本地,或者发送到网络,然后再反序列还原该对象.通常这种对象的类需要实现Serializable接口,在实现该接口时,一般需要提供一个静态变量,像这样子: public class Throwable implements java.io.Serializable { private static final long serialVersionUID = -3042686055658047285L; 如果你定义的类实现了Serializable接口,但是没有提

java 实现serialVersionUID

文章转自  https://www.cnblogs.com/duanxz/p/3511695.html 作用 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的. 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较, 如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是Invali

PHP和Java的区别和用处?

1.php的利益 (1)即写即用 也便是说每次只需一改动结束,用户立马看到效果,而java则慢多了,代码改动结束后,要从头编译,然后重启jvm,中心消耗的时刻可是不少啊,并且重启jvm进程可是会构成用户照应间断的. (2)写东西快 php能够说是十分活络的,一个需求给到,只需不考虑后期的功用和用户量问题,那是适当快速的,乃至你都能够不必结构,直接写也会十分快的,写一个增删改查功用,或许也就30-50行代码就搞定了. 而java就慢多了,首先要想一下用什么结构,现在根本上便是spring了,然后便

Java中的SerialVersionUID

序列化及SergalVersionUID困扰着许多Java开发人员.我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serializable接口的类中没有定义SerialVersionUID的话会怎样?抛开它的复杂性以及不太常用不说,一个原因就是Eclipse在缺少了SerialVersionUID之后的给出的警告提示:"The Serializable class Customer does not declare a static final SerialVersi