Serializable中的serialVersionUID到底有啥用
最近在研究跨进程通信的问题,于是又再一次研究了,我们熟悉而又陌生的Serializable接口。
那么好,做过Java开发的朋友肯定对这个接口不陌生吧,Java中就是通过这个接口,来实现了序列化和反序列化的,那么下面看看使用Serializable接口的小例子。
- public class User implements Serializable{
- private String name;
- private int age;
- private float height;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public float getHeight() {
- return height;
- }
- public void setHeight(float height) {
- this.height = height;
- }
- @Override
- public String toString() {
- return "User [name=" + name + ", age=" + age + ", height=" + height + "]";
- }
- }
public class User implements Serializable{
private String name;
private int age;
private float height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", height=" + height + "]";
}
}
上面是我们常见写法的bean,不过呢,Eclipse就会有这个提示:The serializable class User does not declare a static final serialVersionUID field of type long,意思就是说让你添加一个serialVersionUID的值。
不过呢,我们就算不添加,那么也是可以正常序列化的。下面贴一下序列化和反序列化的代码。
- public class Test {
- private static String FILE_PATH = "cache.txt";
- /**
- * 测试SerialVersionUID和不同是否能发序列化成功
- *
- * @param args
- */
- public static void main(String[] args) {
- // 创建一个对象
- User user = new User();
- user.setAge(10);
- user.setName("小可爱");
- user.setHeight(175.6f);
- // 开始序列化
- ObjToFile(user);
- // 开始反序列化
- Object o = FileToObj();
- System.out.println("=====================");
- System.out.println(o.toString());
- }
- /**
- * 序列化
- */<del>
- </del> public static void ObjToFile(Serializable s) {
- ObjectOutputStream _Oos = null;
- try {
- _Oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH));
- _Oos.writeObject(s);
- _Oos.flush();
- System.out.println("序列化成功!");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (_Oos != null) {
- try {
- _Oos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * 反序列化
- */
- public static Serializable FileToObj() {
- ObjectInputStream _Ois = null;
- try {
- _Ois = new ObjectInputStream(new FileInputStream(FILE_PATH));
- Serializable s = (Serializable) _Ois.readObject();
- System.out.println("反序列化成功");
- return s;
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } finally {
- if (_Ois != null) {
- try {
- _Ois.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return null;
- }
- }
public class Test {
private static String FILE_PATH = "cache.txt";
/**
* 测试SerialVersionUID和不同是否能发序列化成功
*
* @param args
*/
public static void main(String[] args) {
// 创建一个对象
User user = new User();
user.setAge(10);
user.setName("小可爱");
user.setHeight(175.6f);
// 开始序列化
ObjToFile(user);
// 开始反序列化
Object o = FileToObj();
System.out.println("=====================");
System.out.println(o.toString());
}
/**
* 序列化
*/<del>
</del> public static void ObjToFile(Serializable s) {
ObjectOutputStream _Oos = null;
try {
_Oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH));
_Oos.writeObject(s);
_Oos.flush();
System.out.println("序列化成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (_Oos != null) {
try {
_Oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 反序列化
*/
public static Serializable FileToObj() {
ObjectInputStream _Ois = null;
try {
_Ois = new ObjectInputStream(new FileInputStream(FILE_PATH));
Serializable s = (Serializable) _Ois.readObject();
System.out.println("反序列化成功");
return s;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (_Ois != null) {
try {
_Ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
先说第一种情况:
其实,如果你不添加serialVersionUID,那么Eclipse在会根据这个类的结构(成员变量,成员变量的个数等),生成一个hash值,然后将这个值作为serialVersionUID。
告诉大家实验步骤:
1、序列化User对象的时候,不要添加serialVersionUID。
2、然后给User对象添加serialVersionUID = 2L,可以随便是个long值。
3、开始对新添加的User对象,进行反序列化。
接着大家就可以看到控制台打印的报错了。
我这边的报错是这样的:
java.io.InvalidClassException: com.peng.test.User; local class incompatible: stream classdesc serialVersionUID = -2110639933710420778, local class serialVersionUID = 2
Serializable中的serialVersionUID到底有啥用的更多相关文章
- Serializable中的serialVersionUID
有序列化,就必然有反序列化!比如在A端为UserLogin(见上一篇对象序列化)做了序列化,然后在B端进行反序列化. 首先需要,A端和B端都定义有相同的UserLogin类.可是,万一两端的UserL ...
- Serializable中的serialVersionUID是必须的吗
不写serialVersionUID就没有吗 即使不写, jdk反序列化时也会自动检查这个id, 反编译.class文件你也看不到这个值 rpc反序列化 如果使用jdk的方式, 这个必须配置 如果使用 ...
- Android Studio类中实现Serializable自动生成serialVersionUID
1.File -> Settings... -> Editor -> Inspections -> Serialization issues -> Serializabl ...
- Java中的SerialVersionUID
Java中的SerialVersionUID 序列化及SergalVersionUID困扰着许多Java开发人员.我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serial ...
- Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...
- Python类中的self到底是干啥的
Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的 ...
- 有趣的冷知识:编程中Foo, Bar 到底什么意思?
转自:编程中Foo, Bar 到底什么意思? 1 前言 在很多国外计算机书本和一些第三份开源软件的Demo中经常用到两个英文单词Foo,Bar.这到底是什么意思呢?从步入屌丝界的IT生活见到这两个单词 ...
- 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!
1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...
- python中的cls到底指的是什么
python中的cls到底指的是什么,与self有什么区别? 2018年07月31日 11:13:09 rs勿忘初心 阅读数:7769 作者:秦风链接:https://www.zhihu.com/ ...
随机推荐
- nodeType 节点的类型
元素结点 1 属性结点 2 attributes 文本结点 3 注释结点 8 document结点 9 documentFragment 11 文档碎片
- Hi3531D搭建环境时,出现的问题
1.展开SDK包得时候,运行./sdk.unpack得时候出现: 原因:ubuntu14.04中默认得是dash,要将dash改成bash. 解决方法:sudo ln -fs /bin/bash /b ...
- 【RHEL7/CentOS7服务控制之systemctl命令】
Systemd对于Linux来说,就是一个init程序,可以作为sysVinit和Upstat的替代. RHEL7监控和控制Systemd的主要命令是systemctl,该命令可查看系统状态和管理系统 ...
- Yeslab 华为安全HCIE-第七门-Agile Controlle
课程目录: 华为安全HCIE-第七门-Agile Controller(12篇)\1_aglie_controller产品亮点讲解.avi 华为安全HCIE-第七门-Agile Controlle ...
- 洛谷 P2558 [AHOI2002]网络传输
P2558 [AHOI2002]网络传输 题目描述 在计算机网络中所有数据都是以二进制形式来传输的. 但是在进行较大数据的传输时,直接使用该数的二进制形式加以传输则往往传输的位数过多. 譬如要传输 1 ...
- BootStrap_Table 学习
https://blog.csdn.net/heting90/article/details/52248729 $("#realTime_Table").bootstrapTabl ...
- deep-in-es6(五)
解构 Destructuring: 解构赋值允许使用类似数组或对象字面量的语法将数组和对象的属性赋值给给中变量. 一般情况访问数组中的前三个元素: var first = arr[0]; var se ...
- vue 点击事件阻止冒泡 用stop
1.使用vue阻止子级元素的click事件冒泡,很简单,用stop.eg: @click.stop='xxx'
- mapper提示Could not autowire. No beans of … type found?
工具及背景: IntelliJ IDEA 2016.1.3 Ultimate.spring boot, maven项目,利用mybatis 注解的方式查询mysql 在自动生成工具生成代码后,serv ...
- 深入具体解释SQL中的Null
NULL 在计算机和编程世界中表示的是未知,不确定.尽管中文翻译为 "空", 但此空(null)非彼空(empty). Null表示的是一种未知状态.未来状态,比方小明兜里有多少钱 ...