理解此警告:可序列化类未声明静态最终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 的相关文章

  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 如何克服 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