IntelliJ Idea生成serialVersionUID

我的问题是如何在IDEA中生成这个值? 我去设置 – >错误 – >序列化问题 – > Serializable类没有“serialVersionUID”,但它仍然没有告诉我的警告。 我的类PKladrBuilding父实现接口Serializable

部分代码:

public class PKladrBuilding extends PRQObject public abstract class PRQObject extends PObject public abstract class PObject implements Serializable 

我不知道如果你有旧版本的IntelliJ,但如果我去File => Settings... => Inspections => Serialization issues => Serializable class without 'serialVersionUID'启用File => Settings... => Inspections => Serialization issues => Serializable class without 'serialVersionUID' ,您提供的类给我警告。

在这里输入图像说明

如果我尝试我看到的第一堂课

在这里输入图像说明

顺便说一句,直到我在每个类的末尾添加{ }以修正编译错误,它才显示出警告。

通过Olivier Descout安装GenerateSerialVersionUID插件

转到: File > Settings > Plugins > Browse repositories > GenerateSerialVersionUID

安装插件并重新启动。

现在你可以从Code > Generate > serialVersionUID或者快捷方式中产生id了。

为了生成价值使用

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

并提供具有以下值的randomLong模板variables:groovyScript(“new Random()。nextLong()。abs()”)

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/

没有任何插件:只需要在IntelliJ中启用突出显示:

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

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

另外你可以添加实时模板来完成这个工作。

Ctrl + Alt + S – > "Live Templates"部分 – > other (或者你想要的)

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

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

然后selectdefinition范围并保存为'serial'

现在你可以在类体中inputserial 标签了。

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

这里是一个细节评论。 我正在处理这里的评论。

其实,你不应该“生成”串行版本的UID。 这是一个愚蠢的“特征”,源于对Java如何使用该ID的普遍误解。 您应该为这些ID提供有意义的可读值,例如从1L开始,每当您认为新版本的类应该呈现所有以前的版本(可能是先前序列化的)时,就递增它们。 所有产生这种ID的实用程序基本上都是当JVM没有定义时执行JVM的操作:它们根据类文件的内容生成值,从而产生无法读取的无意义的长整数。 如果你希望你的类的每一个版本都是独立的(在JVM的眼中),那么你甚至不应该指定serialVersionUID值,因为JVM会生成一个,并且每个版本的类的值将会是独一无二的 明确定义这个值的目的是告诉序列化机制把具有相同SVUID的类的不同版本看作是相同的,例如不要拒绝较旧的序列化版本。 所以,如果你定义了ID并且永远不要改变它(并且我假设你是依靠自动生成的,而且你可能永远不会重新生成你的ID),你可以确保所有的 – 甚至是完全不同的 – 序列化机制将认为您的课程是相同的。 那是你要的吗? 如果不是的话,如果你确实想要控制你的对象是如何被识别的,你应该使用简单的值,你自己可以理解,并且当你认为这个类已经发生了很大的变化时,可以很容易地进行更新。 有一个23位数值根本没有帮助。

希望这可以帮助。 祝你好运。

我正在使用Android Studio 2.1,通过点击Name类并将鼠标hover在灯上,我可以获得更好的灯泡一致性。

如果您想为一堆文件添加缺less的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 

你保存这个脚本,说add_serialVersionUID.sh给你〜/ bin。 然后,在Maven或Gradle项目的根目录中运行它,如下所示:

 add_serialVersionUID.sh < myJavaToAmend.lst 

这个.lst包含java文件的列表,用以下格式添加serialVersionUID:

 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的类时,要保持与旧类的兼容性,这是理想的情况。

将一个名为“ser”的活动模板添加到另一个组中,将其设置为“适用于Java:声明”,并取消“缩短FQ名称”。 给它只是模板文本

 $serial$ 

现在编辑variables并将串行设置为:

 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项目布局。 更改/ build / to / target / Maven。