Java序列化机制中的类版本号问题
2015-01-31 19:16
309 查看
某些实现了serializable接口的java类中会看到名称为serialVersionUID的静态字段,本文从根本上解释这个字段的含义。
知识铺垫
在java中,类的序列化和反序列化是由jvm实现,当然,不同的jvm可能有不同的实现方式,本文讨论java官方的jvm版本号。
一个类,实现serializable接口之后,就代表开发人员同意此类能够被序列化和反序列化,jvm就获得了序列化和反序列化此类的授权。假设没有实现serializable,而直接进行类的序列化操作,jvm会报出异常。
Serializable是一个标识接口,没有不论什么待实现的方法。
概念
Java序列化机制使用名称为serialVersionUID的long型字段来标志类的版本号。序列化对象时,Jvm会把serialVersionUID的值写到类的序列化数据中;反序列化时,JVM会把对象数据数据中的serialVersionUID与本地对应类的serialVersionUID进行比較,假设值不同样(意味着类的版本号不同),那么报异常InvalidCastException,即:类版本号不正确应,不能进行反序列化。假设类版本号同样,则能够进行反序列化。
值
常见的serialVersionUID的值有两种情况:
一种是固定的一个long型值,比方:
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 123L;
另外一种是依据类名、接口名、成员方法及属性等生成一个64位的哈希值(ide能够完毕此工作),比方:
private static final long serialVersionUID = xxxxL;
当实现java.io.Serializable接口的类没有显式地定义一个serialVersionUID值时,Java序列化机制会依据编译的Class生成一个serialVersionUID作序列化版本号比較用,一旦class文件有所变动(比方空格、变量名),那么serialVersionUID也会随之变动。
序列化数据和类版本号同样但结构不同
当一个类和它的序列化数据的版本号同样(即serialVersionUID值同样),但类结构不同一时候,反序列化过程遵循下面规则。
相关文章推荐
- Java序列化的机制和原理,以及自定义序列化问题
- Java序列化机制中的类版本问题 serialVersionUID的静态字段 含义
- Java序列化的机制和原理,以及自定义序列化问题
- Java序列化机制中的类版本问题
- Java序列化机制中的类版本问题
- Java序列化的机制及原理
- java序列化机制学习
- 有关java通过反射机制调用类中自有方法的问题
- 大家进来讨论下关于java中的序列化的问题
- java序列化的引用问题以及将transitent的序列化方法
- Java序列化的机制和原理
- Java序列化的机制和原理
- JAVA对象序列化机制
- Java中的对象序列化机制
- java序列化问题
- java序列化机制
- tomcat java.lang.OutOfMemoryError: Java heap space 问题解决;Java垃圾回收机制详解和调优相关链接
- JAVA序列化机制学习札记
- JAVA底层传输机制的问题吗?
- java Enum序列化问题