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 的对象 的相关文章

  • Java 7 默认语言环境

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

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

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

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

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 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