IntelliJ IDEA生成serialVersionUID

Kir*_*rov 287 java serialization intellij-idea

如何在IntelliJ IDEA中生成此值?

我转到设置 - > 错误 - > 序列化问题 - >没有'serialVersionUID'的Serializable类,但它仍然没有显示警告.我的类PKladrBuilding父实现接口Serializable.

部分代码:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 562

我不确定您是否有旧版本的IntelliJ IDEA,但如果我转到菜单文件设置...检查序列化问题 →没有启用'serialVersionUID'的Serializable类,则您提供的课程会给我警告.

在此输入图像描述

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

在此输入图像描述

顺便说一句:在我添加{ }到每个类的末尾以修复编译错误之前,它没有向我显示警告.

  • 我在v15中使用它的方法是将鼠标悬停在ClassName上以查看警告并将鼠标缓慢移向排水沟.此时,"灯泡"出现在屏幕上.(如果第一次没有按预期工作,请尝试几次).然后,您可以单击"创建字段"选项以创建uid.希望这可以帮助那些坚持这一点的人. (5认同)
  • 试试`文件`| "使高速缓存无效",如果没有帮助,请联系support@jetbrains.com并提供一个示例项目进行重现. (2认同)
  • 我重新安装了IDEA并删除了插件,这对我很有帮助.Tnx很多. (2认同)

Sil*_*ria 166

由Olivier Descout 安装GenerateSerialVersionUID插件.

转到:菜单文件设置插件浏览存储库GenerateSerialVersionUID

安装插件并重新启动.

现在,您可以从菜单代码生成 →serialVersionUID`或快捷方式生成 ID .

  • 是否需要外部插件才能使其正常工作? (13认同)
  • IDEA 12.1.4对我有用.谢谢Mobistry. (4认同)

Nik*_*tre 63

没有任何插件:您只需要在IntelliJ中启用高亮显示:

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

现在,如果您的类实现Serializable,您将看到突出显示,并且alt+Enter类名将建议生成private static final long serialVersionUID.

  • 谢谢。我不知道为什么看不到灯泡,但是单击类名并键入Alt-Enter可以解决问题。 (3认同)
  • 答案从[这里](/sf/ask/1720155041/#36007392)被盗 (2认同)

Emd*_*won 35

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

以下是对此的详细评论.我在这里处理评论.

实际上,您不应该"生成"串行版UID.这是一个愚蠢的"功能",源于对Java如何使用该ID的一般误解.您应该为这些ID提供有意义的,可读的值,例如从1L开始,并在每次认为类的新版本应该渲染所有先前版本(可能先前已序列化)时将其递增.生成此类ID的所有实用程序基本上都执行JVM在未定义ID时所执行的操作:它们根据类文件的内容生成值,从而产生无法读取的无意义的长整数.如果您希望类的每个版本都是不同的(在JVM的眼中),那么您甚至不应该指定serialVersionUID值,因为JVM将动态生成一个,并且您的类的每个版本的值将是独一无二.明确定义该值的目的是告诉序列化机制将具有相同SVUID的类的不同版本视为相同,例如不拒绝旧的序列化版本.因此,如果您定义ID并且永远不会更改它(并且我认为这是您所做的事情,因为您依赖于自动生成,并且您可能永远不会重新生成您的ID)您将确保所有 - 甚至绝对不同 - 的版本通过序列化机制,您的类将被视为相同.那是你要的吗?如果没有,并且如果您确实希望控制对象的识别方式,则应该使用您自己可以理解的简单值,并在您确定类已经发生显着变化时轻松更新.拥有23位数值并没有任何帮助.

希望这可以帮助.祝好运.

  • 谢谢,我很长一段时间都在跳过这个简单的事实! (3认同)
  • 当我不想在反序列化时支持旧版本时,实际上我会使用新的随机数重新生成“serialVersionUID”。也许我不需要使用随机数,但可以从 1 开始并递增。然而,“3L”对我来说并不比“-3518231192373568183L”更有意义。因此,我认为这两种解决方案的工作原理相似。不过,随机数可能有一个优点,即它适用于具有分叉和分支的非线性历史。 (2认同)

pha*_*lvi 16

为了生成值使用

private static final long serialVersionUID = $randomLong$L;
$END$
Run Code Online (Sandbox Code Playgroud)

并为randomLong模板变量提供以下值:groovyScript("new Random().nextLong().abs()")

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


fal*_*s4e 13

此外,您还可以添加可以完成工作的实时模板.

要做到这一点,按Ctrl+Alt+S- > "Live Templates"部分 - > other(或你希望的w/e)

然后使用如下定义创建一个新的:

private static final long serialVersionUID = 1L;
$END$
Run Code Online (Sandbox Code Playgroud)

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

现在你可以输入serialTAB类体了.


jer*_*ile 9

最简单的现代方法:Alt+ Enteron

private static final long serialVersionUID = ;
Run Code Online (Sandbox Code Playgroud)

IntelliJ 将在=. 将光标放在上面并点击alt+ Enter(Mac 上的Option+ Enter)。你会得到一个弹出窗口,上面写着“随机更改 serialVersionUID 初始化程序”。只需按回车键,它就会用随机长度填充该空间。