【问题标题】:java.io.NotSerializableException: java.lang.reflect.Constructorjava.io.NotSerializableException: java.lang.reflect.Constructor
【发布时间】:2013-01-03 19:02:37
【问题描述】:

我想从我的JTable 序列化一个模型,不幸的是我得到了一个NotSerializableException。 我所有的字段都是Serializable,我不明白这里的问题出在哪里。

public class Sauvegarde extends AbstractAction implements Serializable {

    private static final long serialVersionUID = 1L;
    public DefaultTableModel model;

    public Sauvegarde(String string) {
        super(string);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        sauve_actionPerformed(e);
        System.exit(0);

    }

    public void sauve_actionPerformed(ActionEvent e) {
        this.model = Grille.dfm;
        try {

            // Serialisation
            FileOutputStream fos = new FileOutputStream("sauve.tmp");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(model);
            oos.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

这是我创建 JTable 和模型的类:

    String[] columnTitles = { "A", "B", "C", "D", "E"};
    String[] cellulesVide = { "", "", "", "", ""};
    String[][] rowData = new String[nombreDeLignes][5];

    dfm = new DefaultTableModel(columnTitles,0);


    //table.setCellSelectionEnabled(true);


    for (int i = 0 ; i < nombreDeLignes ; i++)
    {   
        dfm.addRow(cellulesVide);
    }


    table = new JTable(dfm) {

【问题讨论】:

  • 答案就在问题中:你的模型引用了 java.lang.reflect.Constructor 的一个实例,而这个类是不可序列化的。
  • Désolé je ne comprend pas, DefaultTableModel est une classe Serializable d'après la doc ...
  • 表模型存储项目模型的向量。您在模型中存储什么类型的项目?你确定那些是正确可序列化的吗?也许发布一些您用于项目模型的类的代码?
  • 我只是将字符串存储在我的模型中。我受到此链接的启发:javafr.com/codesource.aspx?ID=24694
  • 如果你只存储字符串,你不会得到异常。向我们展示创建和填充模型的代码,以及异常的完整堆栈跟踪。并始终在 finally 块中关闭您的流。

标签: java swing serialization stream jtable


【解决方案1】:

没有魔法。

您应该检查对象层次结构中的所有类及其字段。 所有字段和类都应该是可序列化的或原始的。

Parent 可能不可序列化,但它必须有一个默认构造函数。

如果上述条件成立,它应该可以工作。

【讨论】:

  • 当然,我做到了,正如你所看到的,这个类只包含 1 个字段,而且这个类是可序列化的。在正常情况下,异常会告诉我哪个类发生冲突,但这里的异常什么也没说..
  • @superstarz 好的,然后一步一步。这是什么 Grille.dfm?
  • @superstarz 用假格栅尝试了你的例子,有字段 public static DefaultTableModel dfm;我在一个静态块中初始化。一切正常。您的示例缺少一些细节。什么是 nombreDeLignes? int numberOfLines = 5,还是别的什么?你确定,没有代码会覆盖 dfm?
【解决方案2】:

在某个地方,您直接或间接地拥有一个构造函数类型的非瞬态数据成员,它不是可序列化的,正如异常所说。找到它并使其暂时化,或消除它。构造函数不可序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2013-07-11
    • 2013-09-13
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多