zoukankan      html  css  js  c++  java
  • Java序列化机制中的类版本问题 serialVersionUID的静态字段 含义

    Java序列化机制中的类版本问题

    分类: 【Java 基础】
     

    目录(?)[+]

     
     
     
     
     

    内容简介

     

    某些实现了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值相同),但类结构不同时,反序列化过程遵循以下规则。---下边内容摘抄处也没有下边内容

  • 相关阅读:
    深入了解spring(二) IOC容器
    深入了解spring(一) spring的作用
    深入了解Java虚拟机(二)
    关于scroll、client、offset和style中的height、width、top以及bottom属性
    打开桌面上的图标就会弹出"打开些文件可能会对您的计算机有害"解决方案
    Windows中区位码转换为机内码
    Servlet 上传图片
    Java&Quartz实现任务调度
    JavaMail
    JavaWeb 二维码
  • 原文地址:https://www.cnblogs.com/wzhanke/p/4836486.html
Copyright © 2011-2022 走看看