IntelliJ IDEA生成serialVersionUID

如何在IntelliJ IDEA中生成这个值?

我去设置 -> 错误 -> 串行化问题 -> Serializable类没有' serialVersionUID ',但它仍然没有显示警告。我的类PKladrBuilding父类实现了接口可串行化的

部分代码:

public class PKladrBuilding extends PRQObject


public abstract class PRQObject extends PObject


public abstract class PObject implements Serializable
263082 次浏览

我不确定你是否有一个旧版本的IntelliJ IDEA,但如果我去菜单文件设置…检查串行化问题→Serializable类没有'serialVersionUID' '启用,你提供的类给我警告。

Enter image description here

如果我尝试第一堂课,我看到:

Enter image description here

BTW:直到我在每个类的末尾添加{ }来修复编译错误,它才向我显示警告。

安装Olivier Descout的GenerateSerialVersionUID插件。

进入:菜单文件设置插件浏览存储库GenerateSerialVersionUID

安装插件并重新启动。

现在您可以从菜单代码生成→serialVersionUID '或快捷方式生成id。

此外,您可以添加活的模板,将做的工作。

Ctrl + Alt + S -> "Live Templates" section -> other(或w/e你希望)

然后用这样的定义创建一个新的:

private static final long serialVersionUID = 1L;
$END$

然后选择definition范围并将其保存为'serial'

现在你可以在类主体中输入serial选项卡

为了产生价值而使用

private static final long serialVersionUID = $randomLong$L;
$END$

并为randomLong模板变量提供以下值: .nextLong groovyScript(“新随机()().abs ()) < / p >

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/ < a href = " https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/ " > < / >

如果您想为一堆文件添加缺少的serialVersionUID, IntelliJ IDEA可能不能很好地工作。我想出了一些简单的脚本来轻松实现这个目标:

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes


while read f
do
clazz=${f//\//.}
clazz=${clazz/%.java/}
seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

你将这个脚本保存在你的~/bin文件夹中,比如add_serialVersionUID.sh。然后在Maven或Gradle项目的根目录下运行:

add_serialVersionUID.sh < myJavaToAmend.lst

这个.lst包含了添加serialVersionUID的Java文件列表,格式如下:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

该脚本使用JDK的serialVer工具。当您希望修改大量最初没有设置serialVersionUID的类,同时保持与旧类的兼容性时,它是理想的。

我使用Android Studio 2.1,我有更好的一致性,通过点击类名称,并悬停在它一秒钟。

在另一组中添加一个名为“ser”的活动模板,设置为“applied in Java: declaration”,并取消勾选“Shorten FQ names”。给它一个模板文本:

$serial$

现在编辑变量并设置serial为:

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

它采用标准的Gradle项目布局。为Maven更改/build/到/target/。

不需要任何插件:你只需要在IntelliJ中启用高亮:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' -设置标志并单击'OK'

现在,如果你的类实现了Serializable,你会看到高亮显示,并且类名上的alt+Enter会建议生成private static final long serialVersionUID

PS:取自在这里

在序列化上花了一些时间后,我发现,我们不应该用一些随机值生成serialVersionUID,我们应该给它一个有意义的值。

这里有一个详细的评论。我在这里处理注释。

实际上,您不应该“生成”串行版本uid。这是一个愚蠢的“特性”,源于对Java如何使用ID的普遍误解。你应该给这些id赋予有意义的、可读的值,例如,从1L开始,每当你认为类的新版本应该使所有以前的版本(可能是以前序列化的)过时时,就增加它们。所有生成此类ID的实用程序基本上都是在未定义ID时执行JVM的操作:它们根据类文件的内容生成值,从而产生不可读且无意义的长整数。如果您希望类的每个版本都是不同的(在JVM看来),那么您甚至不应该指定serialVersionUID值,因为JVM会动态生成一个,并且类的每个版本的值都是唯一的。显式定义该值的目的是告诉序列化机制将具有相同SVUID的类的不同版本视为相同,例如不要拒绝旧的序列化版本。因此,如果您定义了ID并且从不更改它(我假设这就是您所做的,因为您依赖于自动生成,并且您可能永远不会重新生成您的ID),那么您就确保了类的所有(甚至完全不同的)版本将被序列化机制视为相同的。这是你想要的吗?如果不是,并且确实希望控制对象的识别方式,则应该使用您自己能够理解的简单值,并且在确定类发生重大更改时可以轻松更新。拥有一个23位数的值根本没有帮助。

希望这能有所帮助。祝你好运。

使用版本v2018.2.1

首选项>编辑器>检查> Java >序列化问题>切换“没有'serialVersionUID'的可序列化类”。

警告应该出现在类声明旁边。

另一种生成serialVersionUID的方法是从上下文菜单(或键盘快捷键,默认是ctrl+alt+转变+)中使用>Analyze >Run Inspection by Name,然后键入“没有'serialVersionUID'的Serializable类”(或简单地键入“serialVersionUID”,前面的类型函数将为您找到它。

Idea >Analyze >Run Inspection by Name 然后你会得到一个上下文菜单,你可以在其中选择在哪里运行检查(例如,所有来自特定模块,整个项目,一个文件,…)

使用这种方法,您甚至不需要设置一般检查规则。

最简单的现代方法:Alt+Enter on

private static final long serialVersionUID = ;

IntelliJ将在=后面的空格下划线。把你的光标放在上面,然后点击alt+Enter (Mac上的Option+Enter)。你会看到一个弹窗,上面写着“随机更改serialVersionUID初始化器”。只要按回车键,它就会用一个随机的long填充那个空间。