加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java对象为啥要实现Serializable接口?

发布时间:2019-05-16 04:34:49 所属栏目:建站 来源:无敌码农
导读:导读 最近这段时刻一向在忙着编写Java营业代码,麻痹地搬着Ctrl-C、Ctrl-V的砖,在不知道一再了几多次界说Java实体工具时implements Serializable的C/V大法后,脑海中溘然冒出一个思想(A):问了本身一句Java实体工具为什么必然要实现Serializable接口呢?,

对付JVM来说,要举办耐久化的类必必要有一个标志,只有持有这个标志JVM才应承类建设的工具可以通过其IO体系转换为字节数据,从而实现耐久化,而这个标志就是Serializable接口。而在反序列化的进程中则必要行使serialVersionUID来确定由谁人类来加载这个工具,以是我们在实现Serializable接口的时辰,一样平常还会要去只管表现地界说serialVersionUID,如:

  1. private static final long serialVersionUID = 1L; 

在反序列化的进程中,假如吸取方为工具加载了一个类,假如该工具的serialVersionUID与对应耐久化时的类差异,那么反序列化的进程中将会导致InvalidClassException非常。譬喻,在之前反序列化的例子中,我们存心将User类的serialVersionUID改为2L,如:

  1. private static final long serialVersionUID = 2L; 

那么此时,在反序例化时就会导致非常,如下:

  1. java.io.InvalidClassException: cn.wudimanong.serializable.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2 
  2.     at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687) 
  3.     at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1880) 
  4.     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1746) 
  5.     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2037) 
  6.     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568) 
  7.     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428) 
  8.     at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31) 
  9.     at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44) 

假如我们在序列化中没有表现地声明serialVersionUID,则序列化运行时将会按照该类的各个方面计较该类默认的serialVersionUID值。可是,Java官方凶猛提议全部要序列化的类都表现地声明serialVersionUID字段,由于假如高度依靠于JVM默认天生serialVersionUID,也许会导致其与编译器的实现细节耦合,这样也许会导致在反序列化的进程中产买卖外的InvalidClassException非常。因此,为了担保跨差异Java编译器实现的serialVersionUID值的同等,实现Serializable接口的必需表现地声明serialVersionUID字段。

另外serialVersionUID字段地声明要尽也许行使private要害字修饰,这是由于该字段的声明只合用于声明的类,该字段作为成员变量被子类担任是没有效处的!有个非凡的处所必要留意的是,数组类是不能表现地声明serialVersionUID的,由于它们始终具有默认计较的值,不外数组类反序列化进程中也是放弃了匹配serialVersionUID值的要求。

参考资料:

https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true

http://www.tutorialspoint.com/java/java_serialization.htm

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读