繁体   English   中英

Java Serializable问题

[英]Java Serializable Issue

我正在尝试在我的程序中序列化我的模型。 该模型名为“ 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试图序列化模型周围的其他东西一样。

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

暂无
暂无

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

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