Java 无法序列化包含带有比较器的 TreeMap 的对象

2023-12-10

我有一个相当大的项目(来自大学的 OOP 课程):一个学校登记册,学生可以在其中看到他们的成绩,老师可以添加成绩等等。

“基”类是一个单例,其中包含所有使用的类(Java),例如用户数组、类(如学校班级)以及将类和教师与课程相关联的 TreeMap。

我想序列化这个基类(Central),以便保存修改后的数据。问题是我得到这个异常

java.io.NotSerializableException: liceu.Central$1
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:440)
at java.util.TreeMap.writeObject(TreeMap.java:2265)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at liceu.Main.main(Main.java:31)

我的所有类都实现了可序列化,并且它们没有瞬态或静态字段(单例除外,它具有实例变量和 getInstance 方法作为静态)。

因为需要发布大量代码(并且在提交之前发布它可能会导致我的作业无效),所以我尝试通过尝试隔离错误来进行概念证明。

public class Central implements Serializable
{
    private ArrayList <User> users;
    private ArrayList <Class> classess;
    private TreeMap <Course, TreeMap <Class, Professor>> reunite;
    private static Central instance = null;

    private Central()
    {
        users = new ArrayList<>();
        classess = new ArrayList<>();
        reunite = new TreeMap<>(new Comparator<Student>(){
            @Override
            public int compare(Student e1, Student e2)
            {
                return e1.getName().compareTo(e2.getName());
            }
        });
    }
}

如果我只保留前 2 个 ArrayList,序列化过程就可以工作。 问题出在 TreeMap 上。

TreeMap 类可以序列化吗? (一般来说) 是因为匿名比较器吗?

这是序列化的主类

public class Main
{
    public static void main(String args[])
    {
        Central cent = Central.getInstance();
        FileOutputStream fos;
        ObjectOutputStream oos;

        cent.addUser(new Student(3,"id","pass","name","surname"));
        cent.addUser(new Student(3,"id2","pass","name","surname"));
        cent.addUser(new Student(3,"id1","pass","name","surname"));
        try
        {
            fos = new FileOutputStream("save.txt");
            oos = new ObjectOutputStream(fos);
            oos.writeObject(cent);
        }

        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

TreeMap 保存对用于比较键的比较器的引用。比较器是不可序列化的匿名类的实例。所以你会得到这个异常。

将匿名比较器重构为顶级或命名内部类,该内部类也实现了可序列化。

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

Java 无法序列化包含带有比较器的 TreeMap 的对象 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为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
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • Android:SQLite (ORMLite) 事务隔离级别

    我在我的 Android 项目中使用 ORMLite 我知道 Sqlite 负责文件级锁定 多个线程可以读取 一个可以写入 锁可以防止多次写入 有人可以解释一下 如果一个线程正在更新某些记录而另一个线程正在尝试读取该记录 会发生什么情况 线
  • 向上导航未启动父活动

    我有两项活动A and B其中 A 是 B 的父级 现在我显示一个启动 B 的通知 当我点击该通知时 B 就会启动 然后我点击up按钮 当活动 A 位于后台堆栈时 它可以正常工作 但否则应用程序只是关闭并且不会启动活动 A 我的设置 我已在
  • 子目录中的 Zend 应用程序使 Zend 布局链接正常工作

    我在子目录中设置了一个 Zend 应用程序 不要问为什么我必须这样做 不是我喜欢的方法 但我没有这样的选择 Zend 应用程序驻留在名为 dsa 的子目录中 http dsa dev dsa 我的 htaccess RewriteEngin
  • 如何确定 iPhone 6+ (plus) 处于标准模式还是缩放模式

    我正在尝试确定 iPhone 6 是处于标准模式还是缩放模式 但我找不到任何可以帮助确定这一点的 API 到目前为止 唯一指示手机处于哪种模式的是nativeScale if UIScreen mainScreen nativeScale
  • Numpy 矩阵乘法 U*B*U.T 产生非对称矩阵

    在我的程序中 我需要以下矩阵乘法 A U B U T where B is an M M对称矩阵 以及U is an N M其列正交的矩阵 所以我期望A也是一个对称矩阵 然而 Python 并没有这么说 import numpy as np
  • 可以读取但不能更新

    Problem 在 SQL Server 2008 R2 中 使用经典 ASP 页面中的 SQL 来更新数据库的任何尝试都会被拒绝 简而言之 可以读取 但无法在 ASP 页面中使用 SQL 更新 写入数据库 错误信息 SQL Server
  • 删除/删除数组中某些索引处的值

    我有一个像这样的数组 peoples dick jane harry debra hank frank 一个包含这样的键 keys 1 6 3 12 现在我可以写这样的东西 var peoplesStripedOfKeyPostions f
  • 图像列表/图像内存不足异常

    从 ImageList 获取图像时 我遇到了 OutOfMemoryException 我一直无法找到该问题的适当解决方案 我有一个自定义 ListView 控件 它附加了一个用于绘制 ListViewItems 的事件 然后调用一个用于绘
  • 如何在 Windows 中以编程方式安装驱动器?

    我们生产和销售一种设备 我们的用户有时希望通过多个 USB 集线器将其大量连接到他们的计算机 它是一种 USB 复合设备 同时具有人机接口 HID 和大容量存储 MSD 接口 Windows 会自动安装每个设备的文件系统 直到 Z 处的字母
  • JButton.setBounds(x,y,w,h) 似乎不起作用

    import javax swing JButton import javax swing JFrame import javax swing SwingUtilities public class SimpleExample extend
  • Docker:命令返回非零代码:137

    我的docker文件如下 Use python 3 6 image FROM python 3 6 ENV PYTHONUNBUFFERED 1 install required packages RUN apt get update RU
  • 如何找到给定数据库的 Sybase 索引列表?

    如何在 Sybase 中找到给定数据库的索引列表 Query against sysobjects and sysindexes SELECT o name i name FROM sysobjects o JOIN sysindexes
  • 获取给定一周的第一天

    我将当前周作为整数 截至目前为 43 我需要周一的日期 格式如 Mon Oct 25 我以为我可以通过一个函数来实现这一点 但我不知道该怎么做 有什么建议么 编辑 我尝试了 R 的建议 但没有给出预期的结果 难道是我执行错了 time t
  • 在 UIDocument 完成处理程序中,在 IOS 5 中永远不会被调用,但在 IOS 6 中可以工作

    在 UIDocument 完成处理程序中 在 IOS 5 中永远不会被调用 但在 IOS6 中可以工作 None
  • 如何使用 Word 互操作在表格中为每个新页面创建标题?

    我正在尝试创建一个带有标题的表格 我希望该表的每个新页面都重复此标题 如何使用 Word 2007 Interop 在 C 中执行此操作 Microsoft Office Interop Word Table table table Row
  • 按因子选择数据框中的第 n 个元素

    我有一个带有文本列的数据框name和因素city 首先按字母顺序排列city进而name 现在我需要获取一个数据框 其中每个数据框仅包含第 n 个元素city 保持这个顺序 如何在没有循环的情况下以漂亮的方式完成它 I have name
  • 如何使用 js 或 jQuery 将自定义 HTTP 标头添加到 ajax 请求?

    有谁知道如何使用 JavaScript 或 jQuery 添加或创建自定义 HTTP 标头 根据您的需要 有多种解决方案 如果你想将自定义标头 或标头集 添加到单个请求然后只需添加headers财产 Request with custom
  • jQuery 1 分钟倒计时,带毫秒和回调

    我试图找到一种方法来显示一个简单的倒计时 显示 1 00 00 其中 1 分钟 00 秒 00 毫秒 我在互联网上发现了大量的 jQuery 倒计时 但没有一个包含本地显示毫秒的能力 而且我真的不想挖掘数千行代码来尝试找到一种方法来破解它我
  • Eclipse 中使用 Java8 时出现类型推断编译器错误,但使用 Java7 时则不然 [重复]

    这个问题在这里已经有答案了 下面的代码无法在使用 jdk 1 8 0 05 的 Eclipse Luna 中编译 Eclipse 编译器显示 类型不匹配 无法从 Integer 转换为 long 它在 Luna 中使用 jdk 1 7 进行
  • Java 无法序列化包含带有比较器的 TreeMap 的对象

    我有一个相当大的项目 来自大学的 OOP 课程 一个学校登记册 学生可以在其中看到他们的成绩 老师可以添加成绩等等 基 类是一个单例 其中包含所有使用的类 Java 例如用户数组 类 如学校班级 以及将类和教师与课程相关联的 TreeMap