我正在尝试在我的程序中序列化我的模型。该模型名为“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:
所以是的,就像我说的那样,就像Java试图序列化模型周围的其他东西一样。
答案 0 :(得分:4)
我猜EventFactory
以某种方式进入ImageModel
的字段。也许是从Observer
间接链接的。也许您应该在尝试序列化或将该字段设置为transient
之前清除该列表。