本文主要是介绍实现序列化和反序列化为什么要实现Serializable接口?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.什么是序列化和反序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
2.什么时候要用到序列化和反序列化?
当我们只在JVM里面运行Java实例,这个时候是不需要什么序列化和反序列化的。但当我们需要将内存中的对象持久化到磁盘,数据库中时,或者需要与浏览器进行交互时,这个时候就需要序列化和反序列化了。
3.实现序列化和反序列化为什么要实现Serializable接口?
在Java中一个类实现了Serializable接口后,JVM在类加载的时候就会发现我们实现了这个接口,然后在初始化实例对象的时候就会在底层帮我们实现序列化和反序列化。如果被写对象类型没有实现Serializable接口,那么在进行序列化的时候,将抛出NotSerializableException。
4.实现Serializable接口之后,为什么还要显示指定serialVersionUID的值?
如果不显示指定serialVersionUID,JVM在序列化时会根据属性自动生成一个serialVersionUID,然后与属性一起序列化,再进行持久化或网络传输。在反序列化时,JVM会再根据属性自动生成一个新版的serialVersionUID,然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较,如果相同则反序列化成功,否则报错。如果显示指定了serialVersionUID,JVM在序列化和反序列化时仍然都会生成一个serialVersionUID,但值为我们显示指定的值,这样在反序列化时新旧版本的serialVersionUID就一致了。如果我们的类写完后不再修改,那么不指定serialVersionUID不会有问题。但这在实际开发中是不可能的,我们的类会不断迭代,一旦类被修改了,那旧对象反序列化就会报错。所以在实际开发中,我们都会显示指定一个serialVersionUID
5.static属性为什么不会被序列化?
因为序列化是针对对象而言的,而static属性独立于对象存在,随着类的加载而加载,所以不会被序列化。
这篇关于实现序列化和反序列化为什么要实现Serializable接口?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!