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。