每当Class implements Serializable时候,我们的目的非常明确:我要持久化.
public class Person implements Serializable {
}
持久化其实可以这么理解:我们可以通过某种方式将对象从内存块转换为可以传输或可以保存的数据流。等我们想用的时候,再用某种方式将数据流转换为内存块。
在Java中,内存块和数据流的转换我们可以使用“序列化”和“反序列化”,但是当序列化和反序列化的类不一致的情况下,JVM会抛一个InvalidClassException的异常。
比如序列化时候的对象:
public class Person implements Serializable {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
反序列化时候的对象:
public class Person implements Serializable {
private String sex = "";
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
很明显,序列化时候和反序列化时候两个类的版本明显不同了。JVM检测出了这个版本的差异,并抛出异常。那么JVM是如何判断类的版本呢?JVM是通过流标识符(Stream Unique Identifier)来进行版本的判断的。这个流标识符分为了显式声明和隐式声明两种。
显式声明格式如下:
private static final long serialVersionUID = 8383901821872620925L;
显式声明其实也就是自己进行声明。那么隐式声明就是自己不声明,在编译的时候,编译器帮我生成。这个隐式声明的规则比较复杂,它会根据包名、类名、继承关系、非私有方法、属性以及参数、返回值等等计算得出的。
JVM在反序列化时,会比较数据流中的serialVersionUID与类的serialVersionUID是否相同,如果不同的话JVM就会抛出InvalidClassException。
显示声明可以让我们“骗过”JVM,使它认为两个版本是完全相同的,这样也是实现了反序列化向上兼容。
分享到:
相关推荐
主要介绍了Java对象Serializable接口实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要为大家详细介绍了java中Serializable接口作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差 实现...
详细讲解了C#中关于对象序列化的知识,包括基本序列化、选择序列化、自定义序列化;对于了解在C#中如何进行对象的序列化有价值
android Activity之间数据传递 Parcelable和Serializable接口的使用的具体实例代码,详情请看>http://blog.csdn.net/js931178805/article/details/8268144
主要为大家详细介绍了java中Serializable接口的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Serializable有一个子接口Externalizable,实现Externalizable接口的类可以自行控制对象序列化荷反序列化过程。 一般来说,没有必要自己实现序列化接口,直接交给Java虚拟机是上策。 实现了序列化接口的类,如果...
NULL 博文链接:https://tony-lee-s.iteye.com/blog/1416044
代码中,我们定义了一个 Person 类,并实现了 Serializable 接口。Person 类有两个属性:name 和 age,其中 age 属性被标记为 transient,表示不参与序列化。我们创建了一个 Person 对象,并将其序列化到文件 person...
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
Intent在不同的组件中传递对象数据的应用非常普遍,大家都知道在intent传递对象的方法有两种:1、实现Serializable接口、2、实现Parcelable接口。 Android中Intent传递对象的两种方法Serializable,Parcelable请点击...
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一...
Android序列化——Serializable与Parcelable
面试官:“说一下Serializable接口和Parcelable接口的区别吧。” 我们可以从以下两方面来说一说~ 首先我们先给两者来个简单的介绍: 1.定义 Serializable(Java自带): Serializable是序列化的意思,表示将一个对象...
1、为何要序列化? — 把内存中的java对象能够在磁盘上持久保存 — 通过网络传输对象 ...在java里只需让目标类实现Serializable接口,无须实现任何方法。Serializable接口是一种标记接口,用来标明
2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID
序列化 serializable demo ! 序列化 serializable demo !
說明如何將Serializable物件轉成stream
Java 中 Serializable的应用,序列化的作用说明
在C#中的作用-NET 中的对象序列化,了解序列化的意义及相关内容