Witam, mam taki kod
Klasa ImagesPack:
package test.imagespack;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
public class ImagesPack implements Serializable{
HashMap imagesMap;
public ImagesPack(){
imagesMap=new HashMap();
}
public void addImage(String name,String src){
Toolkit t = Toolkit.getDefaultToolkit();
imagesMap.put(name, t.getImage(src));
}
public void addImage(String name, Image img){
imagesMap.put(name, img);
}
public Image getImage(String name){
Image i;
if(imagesMap.containsKey(name)){
i=(Image)imagesMap.get(name);
}else{
i=null;
}
return i;
}
public Iterator getIterator(){
return imagesMap.values().iterator();
}
}
Klasa ImgPackManager:
package test.imagespack;
import java.io.*;
public class ImgPackManager {
ImagesPack imgPack;
public ImgPackManager(ImagesPack _imgPack){
imgPack=_imgPack;
}
public ImgPackManager(){
imgPack=new ImagesPack();
}
public void savePack(String nameOfFile){
FileOutputStream fileOut;
ObjectOutputStream objOut;
try {
fileOut = new FileOutputStream(nameOfFile+".imgPack");
objOut = new ObjectOutputStream(fileOut);
objOut.writeObject(imgPack);
objOut.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public void loadPack(String nameOfFile){
FileInputStream fileIn;
ObjectInputStream objIn;
try {
fileIn = new FileInputStream(nameOfFile+".imgPack");
objIn = new ObjectInputStream(fileIn);
imgPack=(ImagesPack)objIn.readObject();
objIn.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public ImagesPack getPack(){
return imgPack;
}
public void setPack(ImagesPack _imgPack){
imgPack=_imgPack;
}
}
Klasa testująca:
package test.imagespack;
import java.awt.*;
public class tester {
ImgPackManager imgManager;
Image img1;
Image img2;
public static void main(String[] args){
tester test = new tester();
test.run();
}
public tester(){
imgManager=new ImgPackManager();
}
public void run(){
imgManager.getPack().addImage("img1", "img1.png");
imgManager.getPack().addImage("img2", "img2.png");
imgManager.savePack("pack1");
imgManager.loadPack("pack1");
img1=imgManager.getPack().getImage("img1");
img2=imgManager.getPack().getImage("img2");
}
}
Kod ten miał umożliwiać składowanie paru plików graficznych w jednym z rozszerzeniem .imgPack
Problem w tym że JVM NotSerializableException o treści:
java.io.NotSerializableException: sun.awt.image.ToolkitImage
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at test.imagespack.ImgPackManager.savePack(ImgPackManager.java:22)
at test.imagespack.tester.run(tester.java:19)
at test.imagespack.tester.main(tester.java:11)
Znaczy to chyba że obiekt Toolkit nie może być zapisany zatem ten:
public void addImage(String name,String src){
Toolkit t = Toolkit.getDefaultToolkit();
imagesMap.put(name, t.getImage(src));
}
fragment nie działa, pomijając to że wydaje mi się że lokalny obiekt tej metody nie powinien mieć z serializacją nic wspólnego, to nawet po zastąpieniu go tym:
transient Tollkit t;
...
public void addImage(String name,String src){
t = Toolkit.getDefaultToolkit();
imagesMap.put(name, t.getImage(src));
}
i tak nie działa- nadal zgłasza ten sam wyjątek.
Co powinienem zrobić, co porawić, co usunąć aby to działało? I w ogóle to w czym jest problem?