在网络传输Java对象、将Java对象存储到文件、将Java对象以BLOB形式存储到数据库中时,需要对Java对象进行序列化及反序列化,标准模式是实现Serializable接口。
实现上述接口时,需要提供一个Serial Version UID,该UID用于标识类的版本。一个对象被序列化后,只要其版本不变,都可以进行反序列化,一旦
改变造成版本不一致,会抛出InvalidClassException异常。
建议显示定义UID,如果不显示定义,JVM会自动产生一个值,这个值和编译器的实现有关,不稳定,可能在不同JVM环境下出现反序列化抛出InvalidClassException异常的情况。
在Eclipse中,提供两种方式显示定义UID,一种是“add default serial version ID”,默认值为1L;另一种是“add generated serial version ID”,默认值是一个很大的数,是根据
类的具体属性而生成,当类属性有变动时,该值会更改。
建议采用第一种自动生成方法,当对类进行了不兼容性修改时,需要修改UID。
采用第二种方法时,如果修改了属性,不重新生成UID时,默认值是不会变的,也可以正常反序列化,但不推荐,毕竟UID的值与实际不符。
对类进行兼容性和不兼容性修改的情况请参见以下url:http://docs.oracle.com/javase/7/docs/platform/serialization/spec/version.html。
Hibernate的pojo类建议也采用上述方法,便于扩展。
对于继承关系,父类实现序列化接口,子类可以继承接口的实现,但需显示定义UID,因为父类UID类型为private static,不可被继承,同时子类作为单独的类需要单独的UID。
关于Java Serial Version UID的一些说明
时间: 2024-11-05 04:55:57
关于Java Serial Version UID的一些说明的相关文章
Java Bad version number in .class file
错误信息: java.lang.UnsupportedClassVersionError: Bad version number in .class file at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) a
Java Concurrency - Fork/Join Framework
Normally, when you implement a simple, concurrent Java application, you implement some Runnable objects and then the corresponding Thread objects. You control the creation, execution, and status of those threads in your program. Java 5 introduced an
JAVA串口通讯程序
package com.jetf.serialport; import gnu.io.CommPortIdentifier; import gnu.io.NoSuchPortException; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.Unsuppor
Effective Java 74 Implement Serializable judiciously
Disadvantage of Serializable A major cost of implementing Serializable is that it decreases the flexibility to change a class's implementation once it has been released. If you accept the default serialized form, the class's private and package-priva
Java程序与RSR232串口通讯小练手(转载)
一直以来都是在学习J2EE方面的应用系统开发,从未想过用JAVA来编写硬件交互程序,不过自己就是喜欢尝试一些未曾接触的新东西.在网上搜索了些资源,了解到JAVA写串口通讯的还是蛮多的,那么便着手准备开发调试环境.软件程序开发环境搭建不成问题,可这硬件环境就有点犯难啦.更何况自己用的是笔记本哪来的串口呀,再说要是真拿这串口硬件来自己也不会弄,随即想到了虚拟机,觉得这东西应该也有虚拟的吧,果真跟自己的猜测一样还真有这东西,顺便也下载了个串口小助手做为调试之用.下面就先看看软件环境的搭建: 1.下载c
《Effective Java》第11章 序列化
"将一个对象编码成一个字节流",称作将该对象序列化(serializing); 相反的处理过程被称作反序列化(deserializing),一旦对象被序列化后,它的编码就可以从一台正在运行的虚拟机被传递到另一台虚拟机上,或者被存储到磁盘上,供以后反序列化时用.序列化技术为远程通信提供了标准的线路级(wire-level)对象表示法,也为JavaBeans组件结构提供了标准的持久化数据格式. 第74条:谨慎地实现Serializable接口 代价一:牺牲灵活性 实现Serializabl
.hive命令的3种调用方式 以及源码
安装 hive后 在命令行 如输入 Hive -h -后面随便输入.让让他报错进入命令提示界面 -d 定义一个变量 两种形式 -d A=B or --define A=B -e 执行sql语句 hive -e "select * from a" -f 执行一个sql片段.或者包含sql语句的文本文件 -i 初始化 sql文件.或者包含sql语句的文本文件 [[email protected] Desktop]$ hive -iMissing argument for option:
jdk1.8.0_101/bin下各文件解释
appletviewer - Runs applets outside of a web browser. extcheck - Detects version conflicts between a target Java Archive idlj - Generates Java bindings for a specified Interface Definition Language (IDL) file. jar - Manipulates Java Archive (JAR) fil
Mina中关于多个同类型Filter(如ProtocolCodecFilter)实例共存问题的解决
最近在研读Mina框架的源码,刚好手头上有项目就直接用上了.直接进入正题-- 对Mina有点了解的人都知道,Mina中有一条FilterChain,我们可以向其中加入Filter实现链式处理.从源码看来,多数Filter(如ProtocolCodecFilter)在使用过程只允许有一个实例.若FilterChain中存在多个相同的实例,则有可能出现各种莫明其妙的问题,这些问题往往是超出你预料之外的,而且调试起来比较困难,除非你熟知Mina整个框架.究其原因,主要是在AttributeKey的问题