serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID

说到serialVersionUID,首先要讲讲序列化。

序列化:
序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库、文件系统中,反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。

序列化的作用:
第一种:用于将java对象的字节序列保存到硬盘上储存起来,通常放到一个文件中,使下次需要用到的时候再读取到它之前的信息。
第二种:可以让java对象的字节序列在网络中传输。
序列化的实现:
1)、只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式,该接口没有任何方法,只是标示该类对象可被序列化。
2)、序列化过程:使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。  3)、反序列化过程:使用一个输入流(如:FileInputStream)来构造一个ObjectInputStream(对象流)对象,接着,使用ObjectInputStream对象的readObject(Object obj)方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

在java源代码中Serializable的源代码是以下

public interface Serializable {
}

为什么实现了Serializable 一个空的接口,就可以序列化呢?

Serializable接口不是为了解耦,恰恰是使得程序和jvm耦合吧。

Serializable接口是一种与虚拟机的约定,实现了Serializable接口的类就像是告诉虚拟机“让我具有飞翔的能力”,然后jvm就给了你的类飞翔的能力。

我觉得Serializable和public/static/final/int/synchronized关键字没有区别,都是程序与jvm的约定,或者广义的说“接口”。可以把  serializable看成是java语言级别的或都说是jvm的系统接口

凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:private static final long serialVersionUID; 这个值可以由类指定,也可以不指定。如果不指定的话java会根据class计算serialVersionUID

serialVersionUID是可序列化类的一个版本标识,在反序列化的时候使用这个标识的值来判断序列化和反序列化的对象类型是否一致。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidClassException)。当你一个类实现了Serializable接口,如果没有定义serialVersionUID,编辑器就会提供这个提示功能告诉你去定义之。

类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。显式地定义serialVersionUID有两种用途:
  1)在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
  2)当你序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。
当系统不需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。

Eclipse中有两种生成方式:

一个是默认的1L,比如:“private static final long serialVersionUID = 1L;";

一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:“private static final long serialVersionUID = -8940196742313994740L;”。

使用serialVersionUID要注意以下几点:

1.当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本中未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

2.记住应该总是在可序列化的类中包含这个字段,即使是在第一个类版本中,以便提醒自己这个字段的重要性。不要在未来的版本中改变这个字段值,除非你有意要改变类使其与旧的序列化对象不兼容。

3.如果你的类序列化到硬盘上面后,你更改了类别的field(增加或减少或改名),当你反序列化时,就会出现异常的,这样就会造成不兼容性的问题。但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。

4.当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。但如果在开发大量需要序列化的类的时候,建议还原为原来的设置。这样可以保证系统的性能和健壮。

时间: 2024-10-23 00:03:13

serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID的相关文章

IntelliJ IDEA 中自动生成 serialVersionUID 的方法

as, idea plugin中搜如下关键字,并安装该插件: GenerateSerialVersionUID 如上图所示,创建一个类并实现Serializable接口,然后按alt+Enter键,即可收到提示,然后选择SerialVersionUID: 如上图所示,显然我们已经利用 IntelliJ IDEA 中自动生成serialVersionUID啦! 详述 IntelliJ IDEA 中自动生成 serialVersionUID 的方法 https://blog.csdn.net/qq_

IDEA 自动生成serialVersionUID

场景:刚转到用IDEA,因为需要生成serialVersionUID,并没有自动生成. 转自:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,

eclipse中自动生成javadoc文档的方法

?这篇文章主要介绍了eclipse中自动生成javadoc文档的方法,是实用eclipse开发Java程序时非常实用的技巧,对于进行Java项目开发具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了eclipse中自动生成javadoc文档的方法.分享给大家供大家参考.具体方法如下: 使用eclipse生成文档(javadoc)主要有三种方法: 1. 在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步. 在Jav

idea自动生成serialVersionUID

Setting->Plugins 找到一个叫  GenerateSerialVersionUID 的插件 下载安装好,alt+insert就可以看到 默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需要做以下设置: 1.setting->Inspections->Serialization issues,将serialzable class

Eclipse快捷键自动生成注释代码,修改预格式

用Eclipse编写Java代码,可以快捷键自动生成注释代码,但是自动生成的注释信息都是预先设置好的格式. 其实我们可以在Eclipse中进行设置自己希望显示的信息格式. 方法:点击Windows->Preferences->Java->Code Style->Code Templates, 选择右边窗口中的Comments,对具体的注释信息进行编辑设置. 例如:设置作者作者信息以及日期信息. 选择Types,点击Edit,可以对原来的模板进行修改,原格式如下: /**  * @a

Intellij IDEA 自动生成 serialVersionUID

1, Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’ 2, 在你的class中:Alt+Enter就会提示自动创建serialVersionUID了.

Intellij IDEA 14 自动生成 serialVersionUID

1.  Preferences > Editor > Inspections > Java > Serialization issues > Serializable class without 'serialVersionUID'   勾选上 2.  将光标放在类名上,alt + enter 生成 serialVersionUID

IDEA自动生成 serialVersionUID 设置

1.利用快捷键Ctrl+Alt+S打开工具设置,进行一下配置 2.设置成功后回到项目实体利用快捷键alt+enter点击就可以自动生成了,如图所示 原文地址:https://www.cnblogs.com/maoxy/p/12118587.html

Android Studio类中实现Serializable自动生成serialVersionUID

1.File -> Settings... -> Editor -> Inspections -> Serialization issues -> Serializable class without 'serialVersionUID'(选中) 2.进入实现了Serializable中的类,选中类名,Alt+Enter弹出提示,然后直接导入完成