Serializacja

0

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?

0

Nie Toolkit tylko TookkitImage nie jest serializowalny. Toolkit.getImage() zwraca obiekty typu ToolkitImage ktore implementuja Image. Zamiast zapisywac je zamiec ja jakos na byte[] czy cos.

1 użytkowników online, w tym zalogowanych: 0, gości: 1