Java对象为啥要实现Serializable接口?
对付JVM来说,要举办耐久化的类必必要有一个标志,只有持有这个标志JVM才应承类建设的工具可以通过其IO体系转换为字节数据,从而实现耐久化,而这个标志就是Serializable接口。而在反序列化的进程中则必要行使serialVersionUID来确定由谁人类来加载这个工具,以是我们在实现Serializable接口的时辰,一样平常还会要去只管表现地界说serialVersionUID,如:
在反序列化的进程中,假如吸取方为工具加载了一个类,假如该工具的serialVersionUID与对应耐久化时的类差异,那么反序列化的进程中将会导致InvalidClassException非常。譬喻,在之前反序列化的例子中,我们存心将User类的serialVersionUID改为2L,如:
那么此时,在反序例化时就会导致非常,如下:
假如我们在序列化中没有表现地声明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
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |