博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【序列化】Serializable之SerialVersionUID
阅读量:6412 次
发布时间:2019-06-23

本文共 2295 字,大约阅读时间需要 7 分钟。

hot3.png

Serializable 

可序列化接口,打开jdk   java.io  Serializable,发现,Serializable下没有任何的实现,我们称这样的接口为标志性接口 ,如果某对象,不实现Serializable会报没有序列化异常

http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

Exception in thread "main" java.io.NotSerializableException: src.main.java.com.Io.user.User

什么是序列化

序列化,数据从内存到硬盘 

反序列化:数据从硬盘到内存

序列化版本

某个对象实现了Serializable,java虚拟机会对加上Serializable的对象做一些特殊的处理,就是加上版本号SerialversionUID(java虚拟机的特殊照顾,加上SerialversionUID)

package src.main.java.com.Io.user;import java.io.Serializable;public class Person implements Serializable {    private String name;    public Person (String name) {       this.name= name;    }    @Override    public String toString() {       return "Person {" + "name='" + name+ '\'' + '}';    }}
package src.main.java.com.Io.SerialVersionUIDTest;import src.main.java.com.Io.user.Person;import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class ObjectOutputStreamTest {    public static void main(String[] args) throws Exception {        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));        Person person = new Person("lhx");        oos.writeObject(person);        oos.flush();        oos.close();    }}
package src.main.java.com.Io.SerialVersionUIDTest;import java.io.FileInputStream;import java.io.ObjectInputStream;public class ObjectInputStreamTest02 {    public static void main(String[] args) throws  Exception{        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));        Ojbect object=ois.readObject();        System.out.println(object);        ois.close();    }}

这段代码本来没有问题,但是如果把Person.class删除,然后再次运行ObjectOutputStreamTest.java ,重新生成Person.class,这时候反序列化,是否可以成功,答案是不能,因为两次的SerialversionUID是不同的,下面是异常

java.io.InvalidClassException: com.master.CurrentMessages; local class incompatible:

stream classdesc serialVersionUID = -3227847930051618824,

local class serialVersionUID = -5813841892307787810

类中描述的serialVersionUID是-3227847930051618824  本地类中的是-5813841892307787810

两者不一致,导致的问题

怎么办

不让系统自动生成serialVersionUID ,而是手动写定一serialVersionUID (重点),这样,不管你的类如何升级,都不会产生序列化版本兼容问题。

public class Person implements Serializable {    private static final long serialVersionUID = 5813841892307787810;}

转载于:https://my.oschina.net/u/3523594/blog/1824019

你可能感兴趣的文章
tvOS视差按钮的ObjC实现
查看>>
终端自动提示插件的安装
查看>>
博鳌2019实录 | 机遇与挑战并存,中外行长共议金融科技 ...
查看>>
Oracle DG--Rman备份集搭建备库
查看>>
一个10年技术总监的3个求职方法论
查看>>
蚂蚁金服阳振坤:用10年时间打造一个“顶天立地”的产品 ...
查看>>
对话Roadstar投资人:一家自动驾驶公司之死(一) ...
查看>>
PostgreSQL psql 绘制饼图
查看>>
iPhone诞生以后,从此UI设计行业就迅速发生了翻天覆地的变化! ...
查看>>
java中字符串拼接过程中,StringBuilder和“+”的区别? ...
查看>>
原金立总裁卢伟冰加入小米,雷军发微博欢迎
查看>>
直播:Graph图数据库基础介绍及场景
查看>>
华为首次公布战略研究院 进入创新领航2.0时代
查看>>
P2S、P2P、P2SP之对比
查看>>
如何自学编程?学习方法在这里!
查看>>
苹果“开除”Facebook,原因是后者违反协议分发数据收集APP
查看>>
系统架构 一致性问题 : 库存扣减
查看>>
Okhttp去除请求头user-agent
查看>>
什么是消息队列?
查看>>
为全力发展AIOT,小米把松果电子分拆重组了
查看>>