在Swing中序列化模型时ToolkitImage的NotSerializableException

时间:2011-07-04 23:46:25

标签: exception serialization cursor

我有Swing应用程序来操作形状。在我的工具栏中,我有一个缩放功能,用户通过单击按钮激活,然后鼠标的光标变为放大镜,这是一个图像。 我的问题实际上是光标,对于某些raisons,当我将光标设置在显示形状的面板上时,我无法保存我的模型,我得到java.io.NotSerializableException: sun.awt.image.ToolkitImage异常。

我的模特

public class Document implements IDocObservable,Serializable{

...

public void updateCursor() {
    Iterator<IDocObserver> iter = docObservers.iterator();
    while (iter.hasNext()) {
        iter.next().docCursorChanged();
    }
}
... 

}

行动

public class ZoomInAction extends AbstractAction {


public void actionPerformed(ActionEvent arg0) {
    ...
    Application.getInstance().getActiveDocument().updateCursor();
}

}

显示面板(注意:如果我评论setCursor(..)行,我可以保存)

public class Window extends JPanel implements IDocObserver{
...

public void paint(Graphics g){          
    //drawing the differents shapes
}

@Override

public void docCursorChanged() {        
    setCursor(Utile.getZoomInCursor();
    }
}

}

提供光标的类

public class Utile {

private static Image zoomIn = toolkit.getImage(Utile.class.getResource("/images/zoomin_mouse.png"));
...

public static Cursor getZoomInCursor() {        
    return  toolkit.createCustomCursor(zoomIn, hotSpot, ""); 
}

}

对象的编写是带有outStream.writeObject(doc);

的标准Java方法

感谢

1 个答案:

答案 0 :(得分:1)

您不只是序列化模型,而是序列化IDocObservers列表,其中包括Window extends JPanel实现的IDocObserver。你是否正在序列化JPanel。不要这样做:请参阅Javadoc顶部的警告。你不需要将观察者与观察者一起保存:你不能让那个列表成为瞬态吗?