`
tangkuo
  • 浏览: 103336 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java类序列化与反序列化版本唯一号serialVersionUID 自动生成方法

 
阅读更多
/**
* 序列化与反序列化自动生成serialVersionUID唯一值
* 实现序列化接口,点击java 类黄色按钮选择自动生成版本序列化UID值。
*
*/
private static final long serialVersionUID = -212199624406986608L;



serialVersionUID作用:
       序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
       一个是默认的1L,比如:private static final long serialVersionUID = 1L;
       一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
       private static final   long     serialVersionUID = xxxxL;
关于其定义,可参考JDK文档:http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。

add default serial version ID:
Adds a default serial version ID to the selected type
Use this option to add a user-defined ID in combination with custom serialization code if the type did undergo structural change since its first release.

add generated serial version ID:
Adds a generated serial version ID to the selected type
Use this option to add a compiler-generated ID if the type didnot undergo structural change since its first release.

一种就是1L,一种是生成一个很大的数,这两种有什么区别呢?

看上去,好像每个类的这个类不同,似乎这个SerialVersionUid在类之间有某种关联。其实不然,两种都可以,从JDK文档也看不出这一点。我们只要保证在同一个类中,不同版本根据兼容需要,是否更改SerialVersionUid即可。

对于第一种,需要了解哪些情况是可兼容的,哪些根本就不兼容。 参考文档:http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf

在可兼容的前提下,可以保留旧版本号,如果不兼容,或者想让它不兼容,就手工递增版本号。

1->2->3.....

第二种方式,是根据类的结构产生的hash值。增减一个属性、方法等,都可能导致这个值产生变化。我想这种方式适用于这样的场景:

开发者认为每次修改类后就需要生成新的版本号,不想向下兼容,操作就是删除原有serialVesionUid声明语句,再自动生成一下。

个人认为,一般采用第一种就行了,简单。第二种能够保证每次更改类结构后改变版本号,但还是要手工去生成,并不是修改了类,会提示你要去更新这个SerialVersionUid,所以虽然看上去很cool,实际上让人很迷惑。
参考:

1.一篇较好的关于serialVesionUid的说明:

http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/


分享到:
评论

相关推荐

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要技术,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。`Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    java对象序列化和反序列化

    Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...

    java自动序列化

    需要注意的是,反序列化时,必须保证类的定义与序列化时完全相同,否则会抛出异常。 六、序列化版本ID(serialVersionUID) 为了保证序列化兼容性,Java提供了一个序列化版本ID(serialVersionUID)。当类的结构...

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID 与本地相应实体(类)的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 在 ...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    Java对象的序列化与反序列化Java开发Java经验技巧

    Java对象的序列化与反序列化是Java编程中一项重要的技术,它允许我们将Java对象转换为字节流,便于存储、传输或者在网络间传递。这一过程对于数据持久化、跨进程通信(如RMI,Remote Method Invocation)以及分布式...

    java程序,序列化和反序列化操作对文件的运用

    这个过程需要注意的是,如果类的结构(如字段的添加或删除)发生了变化,那么反序列化可能会失败,因为字节流与新的类结构不匹配。为了避免这个问题,可以使用版本ID(serialVersionUID)来确保序列化兼容性。 ```...

    Java序列化_Java序列化结构_

    如果类在序列化后进行了修改,`serialVersionUID`应该相应更新,否则反序列化可能会失败。如果没有显式定义,Java会自动生成一个基于类结构的默认值。 然而,Java序列化也存在一些潜在的问题和不足: 1. **安全性*...

    Java中的序列化与反序列化:深入理解与实践指南

    在Java编程中,对象的序列化与反序列化是实现数据持久化和网络传输的关键技术。序列化是将对象的状态转换为字节流的过程,以便可以将其保存到文件、数据库或通过网络传输。反序列化则是将这些字节流转换回对象的过程...

    Java对象的序列化和反序列化实践

    为了确保不同版本的类能够正确地进行序列化和反序列化,Java引入了`serialVersionUID`。这是一个用于标识类序列化版本的特殊字段。如果不显式声明,JVM会自动生成一个默认值。但是,当类结构改变时,应该手动更新此...

    Java对象序列化标准最新版

    Java自动处理枚举类型的序列化,无需显式指定序列化策略。 **1.13 保护敏感信息** 在序列化过程中,可能需要处理包含敏感信息的对象。为此,Java提供了一些机制来保护这些信息,例如使用`transient`关键字来标识不...

    java序列化与反序列化

    - **serialVersionUID**: 每个可序列化类都有一个版本标识,用于检查序列化兼容性。如果类在序列化后进行了修改,可能导致反序列化失败,除非手动指定`serialVersionUID`以保持一致性。 - ** transient 关键字**: ...

    Java序列化

    - Java允许使用 `writeObject()` 和 `readObject()` 方法来自定义序列化和反序列化的行为,这两个方法需要在类中声明为`private`,并由`java.io.Serializable` 接口的实现类提供。 7. **序列化安全性** - 序列化...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    Java 文件 序列化 读写

    - 使用`ObjectInputStream`类的`readObject()`方法从文件中反序列化对象。例如: ```java FileInputStream fis = new FileInputStream("object.ser"); ObjectInputStream ois = new ObjectInputStream(fis); My...

    Java 多次序列化对象到同壹個文件及反序列化的问题

    系统会默认生成一个唯一的`serialVersionUID`,用于验证序列化和反序列化的类版本是否一致。如果在序列化后修改了类的结构(如添加、删除或修改字段),`serialVersionUID`会改变,导致反序列化时抛出`...

    java序列化实现演示

    显式声明`serialVersionUID`的好处在于,开发者可以控制序列化版本的变更,确保在类结构变化时,有意识地更新版本号,从而避免意外的反序列化失败。同时,对于库或者框架的开发者来说,这样做还可以保证在升级版本时...

    序列化与反序列化Demo

    在这个"序列化与反序列化Demo"中,我们将深入探讨这两个过程以及它们在Java编程语言中的实现。 首先,让我们理解为什么要进行序列化。在Java中,序列化的主要用途包括: 1. 数据持久化:将对象的状态保存到磁盘,...

    探索Java序列化与反序列化的奥秘:数据持久化的桥梁

    ### Java序列化与反序列化的深入解析 #### Java序列化的重要性及应用场景 Java序列化是一项核心功能,它允许程序员将对象的状态转化为字节流的形式,从而实现对象的持久化存储或者在网络之间进行传递。这对于诸如...

Global site tag (gtag.js) - Google Analytics