Сериализуемая проблема Java - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь сериализовать мою модель внутри моей программы.Модель называется "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 пыталась сериализовать другиевещи вокруг модели.

1 Ответ

4 голосов
/ 13 декабря 2011

Я предполагаю, что EventFactory каким-то образом пробирается в поля ImageModel. Может быть косвенно связаны с Observer. Возможно, вам следует очистить этот список, прежде чем пытаться сериализовать или установить это поле как transient.

...