Serialization trouble shooting
Posted by Influenza on May 11, 2014; 6:59pm
URL: http://imagej.273.s1.nabble.com/Serialization-trouble-shooting-tp5007683.html
Hello Everyone,
I'm currently working on a Plugin that simplifies evaluation of microbiological images. Therefor I planned to develop a serializable object, such that I can save and load my results in an easy way.
I understand that I can only use fields that are serializable as well, but somehow I still receive a NotSerializableException:
java.io.NotSerializableException: sun.java2d.SunGraphics2D
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.writeArray(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.access$300(Unknown Source)
at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source)
at java.io.ObjectOutputStream.writeFields(Unknown Source)
at java.awt.Container.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.writeObject(Unknown Source)
at java.awt.AWTEventMulticaster.save(Unknown Source)
at java.awt.Component.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)
...
Here is my source code:
import ...;
public class EvaSer implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3873721584911475388L;
/**
*
*/
/**
*
*/
public int nSpec;
public int nImages;
public List<int[][]> types;
public String evalName;
public String[] specNames;
public String[] typeNames;
public List<String> imageNames; // For every Image one List element
public List<Roi[][]> rois; // For every Image one Roi[nSpec][]
public List<Roi> fixpoints; // Every Image one Fixpoint
public List<File[]> files; // Original and Evaluated Files
public Roi[] ovrls; // Control Ovrls from Flourescence as Roi[nSpec]
public Color[] specieColors; // Chosen Colors for Species Color[nSpec]
public File dir; // Directory of "Evaluated" ...
public EvaSer(){
this.evalName="new Evaluation "+System.currentTimeMillis();
initLists();
initTypeArrs();
}
private void initTypeArrs() {
typeNames=new String[]{""};
}
public void initLists() {
this.imageNames= new ArrayList<String>();
this.rois= new ArrayList<Roi[][]>();
this.fixpoints= new ArrayList<Roi>();
this.files= new ArrayList<File[]>(); //files[0]= origin; files[1]= evaluated;
this.types= new ArrayList<int[][]>();
}
public void save(Component parent) {
System.out.println(this.nSpec);
System.out.println(this.nImages);
System.out.println(this.types.toString());
System.out.println(this.evalName);
System.out.println(this.specNames.toString());
System.out.println(this.typeNames.toString());
System.out.println(this.imageNames.toString());
System.out.println(this.rois.toString());
System.out.println(this.fixpoints.toString());
System.out.println(this.files.toString());
System.out.println(this.ovrls.toString());
System.out.println(this.specieColors.toString());
System.out.println(this.dir);
String path;
path=this.dir.toString();
if(this.evalName==null){
this.evalName=RegularFunctions.getName(parent);
}
path=path+this.evalName+".eva";
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
oos = new ObjectOutputStream(fos);
oos.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null)
try {
oos.close();
} catch (IOException e) {
}
if (fos != null)
try {
fos.close();
} catch (IOException e) {
}
}
}
public EvaSer load(String path) {
ObjectInputStream ois = null;
FileInputStream fis = null;
Object so= new Object();
try {
fis = new FileInputStream(path);
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
if (obj instanceof EvaSer) {
so = (EvaSer) obj;
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null)
try {
ois.close();
} catch (IOException e) {
}
if (fis != null)
try {
fis.close();
} catch (IOException e) {
}
}
return (EvaSer) so;
}
}
Thanks to all of you who's time I'm stealing ;)