简体   繁体   English

Java Serializable问题

[英]Java Serializable Issue

I'm trying to serialize my model inside my program. 我正在尝试在我的程序中序列化我的模型。 The model is named " ImageModel " and it implements Serializable . 该模型名为“ ImageModel ”,它实现了Serializable This model also contains another custom object named " Perspective " which is also implementing Serializable . 此模型还包含另一个名为“ Perspective ”的自定义对象,该对象也实现了Serializable I have a static utility class that serializes my model and reads it. 我有一个静态实用程序类,它序列化我的模型并读取它。 This code has been tested in the main method with an " ImageModel " and everything is working perfectly. 这个代码已经在主方法中使用“ ImageModel ”进行了测试,一切都运行良好。

But when I try to use it in the actual program I'm running into an issue. 但是当我尝试在实际程序中使用它时,我遇到了一个问题。 The " ImageModel " class is declared in my system class, named " MainWindow " which extends JFrame and is the link between most of the different classes. ImageModel ”类在我的系统类中声明,名为“ MainWindow ”,它扩展了JFrame ,是大多数不同类之间的链接。 For some reason, I can't serialize the model doing something like MainWindow.getModel() . 出于某种原因,我无法将模型序列化为MainWindow.getModel() The compiler argues that my " EventFactory " is not serializable. 编译器认为我的“ EventFactory ”不可序列化。 This class is also declared in " MainWindow ", but I'm not even understanding why Java wants to serialize it, I'm under the impression that java is not just trying to serialize the model, but also the GUI. 这个类也在“ MainWindow ”中声明,但我甚至不理解为什么Java想要序列化它,我的印象是java不只是试图序列化模型,而且还有GUI。

Here are segments of code : 以下是代码段:

My model: 我的模特:

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;
...
}

The perspective class: 透视类:

public class Perspective implements Serializable {

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

The actual GUI that declares the model and other elements: 声明模型和其他元素的实际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;
 ...
 }

The main method: main方法:

    MainWindow mw = new MainWindow();

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

Here are my two utility functions in case you need them : 这是我的两个实用程序函数,以防您需要它们:

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;
}

Here's the STACK_TRACE of the error I'm receiving when working on the actual use case: 这是我在处理实际用例时收到的错误的STACK_TRACE:

http://pastie.org/3008549 http://pastie.org/3008549

So yeah, like I'm saying, it's like if Java was trying to serialize other stuff around the model. 所以,是的,就像我说的那样,就像Java试图序列化模型周围的其他东西一样。

I'm guessing EventFactory is somehow making it's way into ImageModel 's fields. 我猜测EventFactory以某种方式进入ImageModel的字段。 Maybe indirectly linked from an Observer . 也许是从Observer间接链接的。 Perhaps you should clear that list before attempting to serialise or set that field as transient . 也许您应该在尝试序列化或将该字段设置为transient之前清除该列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM