理解此警告:可序列化类未声明静态最终serialVersionUID

2024-03-09

我有一些静态初始化代码:

someMethodThatTakesAHashMap(new HashMap<K, V>() {
{
  put("a","value-a"); 
  put("c","value-c");}
});

由于某种原因,我收到了来自 Eclipse 的警告: 可序列化类不声明静态最终serialVersionUID。

这是在抱怨匿名类吗?我能做什么呢,或者我应该压制它。


您使用的语法称为双括号初始化 http://www.c2.com/cgi/wiki?DoubleBraceInitialization- 这实际上是一个“实例初始化块 http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html这是一个匿名内部类 http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html“(当然不是黑客)。所以,当使用这种表示法时,您实际上是在定义一个新类(!)。

你的情况的“问题”是HashMap http://java.sun.com/javase/6/docs/api/java/util/HashMap.html实施Serializable http://java.sun.com/javase/6/docs/api/java/io/Serializable.html。该接口没有任何方法并且仅用于识别可序列化的语义。换句话说,它是一个标记接口,您实际上不需要实现任何东西。But,在反序列化过程中,Java 使用一个称为serialVersionUID验证序列化版本是否与目标兼容。如果你不提供这个serialVersionUID,就会被计算出来。并且,如 javadoc 中所述Serializable http://java.sun.com/javase/6/docs/api/java/io/Serializable.html,计算出的值非常敏感,因此建议显式声明它以避免任何反序列化问题。这就是 Eclipse 所“抱怨”的(注意,这只是一个警告)。

因此,为了避免出现此警告,您可以添加serialVersionUID到你的匿名内部类:

someMethodThatTakesAHashMap(new HashMap<String, String>() {
    private static final long serialVersionUID = -1113582265865921787L;

    {
        put("a", "value-a");
        put("c", "value-c");
    }
});

但是你失去了语法的简洁性(你甚至可能不需要它)。

因此,另一种选择是通过添加一个来忽略警告@SuppressWarnings("serial")到你调用的方法someMethodThatTakesAHashMap(Map)。这似乎更适合您的情况。

总而言之,虽然这种语法很简洁,但它有一些缺点。首先,如果您持有使用双括号初始化初始化的对象的引用,则隐式持有对不符合垃圾回收条件的外部对象的引用。所以要小心。其次(这听起来像是微优化),双括号初始化有一个非常小的开销 https://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization/924326#924326。第三,正如我们所见,这种技术实际上使用了匿名内部类,因此占用了一些永久代空间(但我怀疑这确实是一个问题,除非你really虐待他们)。最后 - 这可能是最重要的一点 - 我不确定它会使代码更具可读性(这不是众所周知的语法)。

因此,虽然我喜欢在测试中使用它(为了简洁),但我倾向于避免在“常规”代码中使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解此警告:可序列化类未声明静态最终serialVersionUID 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 如何克服 Godot 将按钮字体更改为默认颜色的问题?

    我正在使用 Godot 4 我在容器中手动创建了很多按钮 我在主场景中设置了一个颜色变量 tempcol 当我单击带有 tempcol 设置的按钮时 比如 Color Red 按钮的字体颜色更改为白色 似乎是默认字体颜色 但是当我单击另一个
  • 银光 mpeg-4

    我目前正在开发一个项目 我需要创建一个网络视频播放器 在当前状态下 我的应用程序播放客户端提供的动态 JPEG 和 H264 AVC 格式的录音 问题是 他还想要 MPEG 4 第 2 部分 视觉 我称之为 mp4v 根据this http
  • iOS 中的精确计时

    我正在查看 iOS SDK 中的 Metronome 示例代码 http developer apple com library ios samplecode Metronome Introduction Intro html http d
  • Zend:如何在我的所有视图中添加网页标题?

    现在我必须在所有视图中分别添加标题 如下所示 and 现在如果我想改变测试项目标题的一部分 那么我必须在我的所有观点中更改它 我怎么能在BootStrap php并将其添加到所有视图中 每当我必须改变这一点时 我都会在一个地方改变它 你应该
  • 如何使用 LD_PRELOAD 运行 gdb?

    我有一个使用 LD PRELOAD 的程序 该程序应该像这样运行 这个 LD PRELOAD path to libfoo so qemu U LD PRELOAD a out 如果 没有 gdb 这是我在运行 gdb 时所做的事情 gdb
  • PHPMailer 显示为 root 用户

    我正在使用 PHP Mailer 发送电子邮件 并且我正在使用 SMTP 这是我正在使用的代码 email new PHPMailer email gt IsSMTP telling the class to use SMTP email
  • 是否有使用 javascript 生成 html 的最佳实践

    我正在调用一个 Web 服务 该服务返回 JSON 格式的对象数组 我想获取这些对象并用 HTML 填充 div 假设每个对象都包含一个 url 和一个名称 如果我想为每个对象生成以下 HTML div img src the name d
  • 如何通过在 Android-Studio 中编辑 build.gradle 将我的库放在 android.jar 前面

    First Here s my Java Build Path in Eclipse common jar core jar framework jar layout jar这四个jar是从Android源代码中打包出来的 其中包含一些开发
  • 覆盖 required_without_all laravel 的单个消息

    我一直在 laravel 中至少使用一个 required without all 字段 这是我的规则代码 rental company id gt required without all camper id take over stat
  • PostgreSQL 返回查询日期的精确或最接近日期

    我有以下 postgresql 语法 它返回值 WHERE session date 匹配 date string 问题是有时 date string 在表中不可用 所以我希望返回最接近 date string 的日期 date strin
  • 模拟器中的iPhone相机

    有没有办法在模拟器中使用 iPhone 摄像头测试代码 一定有人写过一些东西 你可以有一个模拟相机的替换组件 在模拟器中 您可以访问一些示例照片库图像 使用 UIImagePickerControllerSourceTypePhotoLib
  • MySQL 何时尝试更新列的索引?

    我正在尝试确定 MySQL 在什么情况下更新索引 假设我有下表 CREATE TABLE MyTable ID INT NOT NULL AUTO INCREMENT MyIndexedColumn VARCHAR NOT NULL MyN
  • 比较 Access SQL 查询中的日期

    我在使用 Access sql 查询时遇到问题 我对此很陌生 所以作为一个菜鸟 很难弄清楚语法 以下是我的查询 SELECT FROM BookingMaster WHERE JourneyDate 01 08 2012 下面是各自的表格数
  • 如何使用 Conduit 保存文件?

    如何使用管道的库保存文件 我浏览了管道的教程 但似乎找不到任何东西 这是我的用例 main IO main do xxs lt lines lt gt readFile filePath sourceList xxs pipe saveFi
  • 如何从 SwiftUI 部分中删除背景颜色? [复制]

    这个问题在这里已经有答案了 我有一个 SwiftUI 部分 如下所示 struct FormView View var body some View Form Section Button action HStack Spacer Text
  • HTTP 错误 504:尝试阅读 Reddit 评论帖子时网关超时

    我在尝试从 reddit 获取评论的 http 时遇到错误 各种 URL 都发生过这种情况 并非所有 URL 都带有特殊字符 这就是其中之一 在一小时内 可能有 1000 个或更多对 reddit com 域的请求 hdr User Age
  • 使用并行线程提高 Python 执行速度

    假设我有这个示例代码 x foo1 something1 y foo2 something2 z max x y 我想通过使用线程来提高这段代码的执行时间 希望它有帮助 不是吗 我想让事情尽可能简单 所以基本上我想做的是创建两个同时工作的线
  • Google App Engine 灵活环境 0 个实例

    在过去的一周里 我发现我的 GAE 灵活环境中的实例数量降至 0 并且没有新实例启动 我对灵活环境的理解是 这不应该是可能的 https cloud google com appengine docs the appengine envir
  • 暂停播放时 MPNowPlayingInfoCenter 未正确反应

    我试图让 MPNowPlayingInfoCenter 在暂停播放时正常工作 我有一个使用 AVPlayer 进行播放的流媒体音乐应用程序 并且我正在通过 Airplay 在 Apple TV 中播放 除了暂停之外的所有内容似乎都在 App
  • 理解此警告:可序列化类未声明静态最终serialVersionUID

    我有一些静态初始化代码 someMethodThatTakesAHashMap new HashMap