我正在使用Android Studio 2.1,通过单击类名称并将鼠标悬停在其上一秒钟,我可以更好地获取灯泡。
随着版本 v2018.2.1
v2018.2.1
去
偏好&gt;编辑&gt;检查&gt; Java&gt; <序列化问题>切换“不带'serialVersionUID'的Serializable类”。
类声明旁边应该出现警告。
花了一些时间在Serialization上,我发现,我们不应该生成 serialVersionUID 有一些随机值,我们应该给它一个有意义的价值。
serialVersionUID
以下是对此的详细评论。 我在这里处理评论。
实际上,您不应该“生成”串行版UID。这是一个愚蠢的“功能”,源于对Java如何使用该ID的一般误解。您应该为这些ID提供有意义的,可读的值,例如从1L开始,每当你认为类的新版本应该渲染所有以前的版本(可能以前是序列化的)时,它们都会递增。生成此类ID的所有实用程序基本上都执行JVM在未定义ID时所执行的操作:它们根据类文件的内容生成值,从而产生无法读取的无意义的长整数。如果您希望类的每个版本都是不同的(在JVM的眼中),那么您甚至不应该指定serialVersionUID值,因为JVM将动态生成一个,并且您的类的每个版本的值将是独一无二。明确定义该值的目的是告诉序列化机制处理具有相同SVUID的类的不同版本,就好像它们是相同的一样,例如,不要拒绝旧的序列化版本。因此,如果您定义ID并且永远不会更改它(并且我认为这是您所做的事情,因为您依赖于自动生成,并且您可能永远不会重新生成您的ID)您将确保所有 - 甚至绝对不同 - 的版本通过序列化机制,您的类将被视为相同。那是你要的吗?如果没有,并且如果您确实希望控制对象的识别方式,则应该使用您自己可以理解的简单值,并在您确定类已经发生显着变化时轻松更新。拥有23位数值并没有任何帮助。
希望这可以帮助。祝好运。
如果要为一堆文件添加缺少的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
~/bin
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的类同时保持与旧类的兼容性时,它是理想的。
没有任何插件:您只需要在IntelliJ中启用高亮显示:
IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID' - 设置标志并单击 'OK' 。
IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'
'OK'
现在,如果你的类实现了 Serializable ,你会看到突出显示,和 alt+Enter 关于班级名称将建议生成 private static final long serialVersionUID 。
Serializable
alt+Enter
private static final long serialVersionUID
为了生成值使用
private static final long serialVersionUID = $randomLong$L; $END$
并提供具有以下值的randomLong模板变量: groovyScript(“new Random()。nextLong()。abs()”)
https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/
此外,您还可以添加可以完成工作的实时模板。
要按它 按Ctrl + Alt + S - &GT; "Live Templates" 部分 - &gt; other (或者你想要的)
"Live Templates"
other
然后使用如下定义创建一个新的:
private static final long serialVersionUID = 1L; $END$
然后选择 definition 范围并将其另存为 'serial'
definition
'serial'
现在你可以输入 serial 标签 在课堂上。
serial