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 ...
随机推荐
- Alpha冲刺(3/10)——2019.4.26
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(3/10)--2019.4.26 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- 牛客网-C++
2017/8/18 程序运行结束时才释放:静态变量在内存的静态存储区,静态数据一直占有着该存储单元直到程序结束:一般局部变量在函数调用结束后释放变量占用的存储单元,而静态局部变量不释放. 静态全局变量 ...
- HTML5 学习07——Video(视频)Audio(音频)
<video> 元素:提供了 播放.暂停和音量控件来控制视频. width 和 height 属性:控制视频的尺寸 <video> 与</video> 标签之间插入 ...
- 保存一个经常用的Makefile
############################################################# # Generic Makefile for C/C++ Program # ...
- let's encrypt申请
let's encrypt申请 https://keelii.com/2016/06/12/free-https-cert-lets-encrypt-apply-install/ https://ww ...
- JavaAes加密操作工具类
package com.king.weixin.util;import java.io.UnsupportedEncodingException;import java.security.Algori ...
- C#使用HttpWebRequest和HttpWebResponse上传文件示例
C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System;using System.Colle ...
- UVA524 素数环 Prime Ring Problem
题目OJ地址: https://www.luogu.org/problemnew/show/UVA524 hdu oj 1016: https://vjudge.net/problem/HDU-10 ...
- sqlite3常用技巧
数据库是一种工具,在合理的条件下使用数据库可以获得许多益处. 使用SQL语句可以完成复杂的统计,可以少写许多复杂逻辑 使用数据库无需担心内存溢出问题 原来可能需要许多文件来保存,现在只需要一个sqli ...
- TableView 无数据时展示占位视图
UITableView+NoDataView.m #import "UITableView+NoDataView.h" #import "NoDataView.h&quo ...