gpt4 book ai didi

Java 可序列化问题

转载 作者:行者123 更新时间:2023-11-29 03:51:42 25 4
gpt4 key购买 nike

我正在尝试在我的程序中序列化我的模型。该模型名为“ImageModel”,它实现了Serializable。该模型还包含另一个名为“Perspective”的自定义对象,它也实现了 Serializable。我有一个静态实用程序类,可以序列化我的模型并读取它。此代码已在带有“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;
...
}

声明模型和其他元素的实际 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 之前清除该列表。

关于Java 可序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8484018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com