【问题标题】:NotSerializableException when using DefaultComboBoxModel in another class在另一个类中使用 DefaultComboBoxModel 时出现 NotSerializableException
【发布时间】:2013-04-23 09:40:44
【问题描述】:

我正在处理一个大型学校项目,它即将结束。 我希望在我的程序中的不同类(JPanels)上同步 2 个 JComboBox,在不太了解 JComponents 的工作原理之后,我发现保存数据的不是 JComboBox 本身,而是 ComboBoxModel。

因此,在向我的 Register(保存我所有数据的类)添加 DefaultComboBoxModel 并将其共享给我的其他两个 JPanel 之后,它终于可以工作了。

但是现在我在将我的 Register 类写入文件时得到了 NotSerializable。 (我一直在将 DefaultComboBoxModel 从我的 Register 类中取出,并让一切恢复正常,所以我知道这是问题所在。

我在文档中可以看到,DefaultComboBoxModel 实现了 Serialiazble,我的模型持有的对象也是如此。

public class Register implements Serializable
{
    ...
    private DefaultComboBoxModel klippPriser;

    public Register()
    {
        ...
        Object[] antTurer = { new KlippPris(5,0), new KlippPris(10,0.05), new KlippPris(15,0.10) };
        klippPriser = new DefaultComboBoxModel(antTurer);
    }

    public DefaultComboBoxModel getKlippPriser()
    {
        return klippPriser;
    }

我的猜测是不可能使用 DefaultComboBoxModel 作为列表来存储对象并写入文件,但我不确定如何解决它并仍然保持程序动态。

我希望我把我的问题说清楚了。谢谢。

EDIT2: 模型拥有的 KlippPris 类。 (不是问题

public class KlippPris implements Serializable
{
    private int antall;
    private double rabatt;

    ...
}

EDIT3: 发现问题在Register不是,而是在SalgAdministrasjon 中。 实在想不通为什么...

Salg.java(Administrasjon 使用了相同的行。)

public class Salg extends JPanel
{
    private Register register;
    ...
    private JComboBox antTurer;

    public Salg(Register r)
    {
        super();
        register = r;
        gui();
    }

    private void gui()
    {
        ...
        paintKortkjøp();
        ...
    }

    private void paintKortkjøp()
    {
        ...
        // This line cause the exception.
        antTurer = new JComboBox(register.getKlippPriser());

        // This line dosen't cause any problems, but won't let my use my model.
        antTurer = new JComboBox();
    }

为什么会这样?我没有写SalgAdministrasjon 到文件,只是注册。 我也尝试过setModel(),但没有成功。

不确定异常是否意味着什么:

com.apple.laf.AquaComboBoxUI

Java v.6,Mac OSX 10.8.3。

【问题讨论】:

    标签: java notserializableexception comboboxmodel


    【解决方案1】:

    为了使一个对象被序列化,它不仅必须实现Serializable,而且所有的类成员也应该是可序列化的。任何不需要序列化的字段都可以声明为transient

    private transient MyUnwrittenType type;
    

    【讨论】:

    • 好的,现在我的程序又可以运行了,但模型中的所有数据都丢失了,并且我从其他调用模型的类中得到 NullPointerException。那么我唯一的解决方案是将模型对象存储在单独的列表中并在开始时添加它们吗?谢谢。
    • 没有sccee 很难说。是否所有字段都序列化,例如KlippPris
    • 是的。 Register 持有的所有对象都是可序列化的,包括 DefaultComboBoxModel 持有的 KlippPris 和我的所有 LinkedLists 持有的对象。我不太确定还要发布什么代码,但我会试一试。正如我在文中所写,只有当我在 Register 中引入 DefaultComboBoxModel 时才会出现问题。
    • DefaultComboBoxModel 是序列化的,包括其所有类成员变量。查看this old bug report 中给出的示例。
    • 我也尝试用Object[] antTurer = { "String"... 替换Object[] antTurer = { new KlippPris(5,0)...,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 2012-01-29
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多