Я пытаюсь сериализовать мою модель внутри моей программы.Модель называется "ImageModel
" и реализует Serializable
.Эта модель также содержит другой пользовательский объект с именем "Perspective
", который также реализует Serializable
.У меня есть статический служебный класс, который сериализует мою модель и читает ее.Этот код был протестирован в методе main с «ImageModel
», и все работает отлично.
Но когда я пытаюсь использовать его в реальной программе, я сталкиваюсь с проблемой.Класс "ImageModel
" объявлен в моем системном классе с именем "MainWindow
", который расширяет JFrame
и является связующим звеном между большинством различных классов.По какой-то причине я не могу сериализовать модель, выполняя что-то вроде MainWindow.getModel()
.Компилятор утверждает, что мой "EventFactory
" не сериализуем.Этот класс также объявлен в "MainWindow
", но я даже не понимаю, почему Java хочет его сериализовать, у меня сложилось впечатление, что java пытается не только сериализовать модель, но и графический интерфейс.
Вот сегменты кода:
Моя модель:
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;
...
}
Фактический графический интерфейс, который объявляет модельи другие элементы:
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 пыталась сериализовать другиевещи вокруг модели.