Java Serializable问题

时间:2011-12-13 03:34:51

标签: java swing ioexception serializable

我正在尝试在我的程序中序列化我的模型。该模型名为“ImageModel”,它实现了Serializable。此模型还包含另一个名为“Perspective”的自定义对象,该对象也在实现Serializable。我有一个静态实用程序类,它序列化我的模型并读取它。此代码已在主方法中使用“ImageModel”进行测试,一切正常。

但是当我尝试在实际程序中使用它时,我遇到了一个问题。 “ImageModel”类在我的系统类中声明,名为“MainWindow”,它扩展了JFrame,是大多数不同类之间的链接。出于某种原因,我不能像MainWindow.getModel()那样序列化模型。编译器认为我的“EventFactory”不可序列化。这个类也在“MainWindow”中声明,但我甚至不理解为什么Java想要序列化它,我的印象是java不只是试图序列化模型,而且还有GUI。

以下是代码段:

我的模特:

public class ImageModel extends Observable implements Cloneable, Serializable {

private String path;
private ArrayList<Observer> observers;
private ArrayList<Perspective> perspectives;
private int numPerspectives;
private Perspective selectedPerspective;
...
}

透视类:

public class Perspective implements Serializable {

private ImageModel image;
private int degreeOfRotation;
private Point topLeftPoint;
private int zoomPercentage;
private int height;
private int width;
 ...
 }

声明模型和其他元素的实际GUI:

public class MainWindow extends JFrame {

    private final int GRID_ROWS = 0;
    private final int GRID_COLUMNS = 2;
    private final int NUM_PERSPECTIVE = 3;
    private JPanel mainPane;
    private ArrayList<View>  perspectiveList;
    private ImageModel imageModel;
    private EventFactory eventFactory;
    private JMenu menu;
    private JToolBar toolBar;
 ...
 }

main方法:

    MainWindow mw = new MainWindow();

    /*
     * Does NOT work:
     * ImageModel imageModel= mw.getImageModel();
     * Utility.serializeModel(imageModel); //Crashes
     * 
     * Works:
     * 
     * ImageModel imageModel= new ImageModel();
     * Utility.serializeModel(imageModel);
     * 
     */

以下是我需要的两个实用程序函数:

public static void serializeModel(ImageModel imageModel)
{
    String filename = "TEST.ser";

    FileOutputStream fos = null;
    ObjectOutputStream out = null;

    try
    {
        fos = new FileOutputStream(filename);
        out = new ObjectOutputStream(fos);
        out.writeObject(imageModel);
        out.close();
    }
    catch (IOException ex) 
    {
        ex.printStackTrace();
    }

}

public static ImageModel restoreModel(String filename)
{
    ImageModel imageModel = null;
    FileInputStream fis = null;
    ObjectInputStream in = null;
    try
    {
        fis = new FileInputStream(filename);
        in = new ObjectInputStream(fis);
        imageModel = (ImageModel)in.readObject();
        in.close();
    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }
    catch(ClassNotFoundException ex)
    {
        ex.printStackTrace();
    }

    return imageModel;
}

这是我在处理实际用例时收到的错误的STACK_TRACE:

http://pastie.org/3008549

所以是的,就像我说的那样,就像Java试图序列化模型周围的其他东西一样。

1 个答案:

答案 0 :(得分:4)

我猜EventFactory以某种方式进入ImageModel的字段。也许是从Observer间接链接的。也许您应该在尝试序列化或将该字段设置为transient之前清除该列表。