NotSerializableExpection

Status
Nicht offen für weitere Antworten.

Arbon

Bekanntes Mitglied
Hallo
bekomme jedesmal wenn ich einen Vektor speichern will eine not Serializable Exception :(

Code:
		private Vector<WakeTime> v = new Vector<WakeTime>();

private void add(WakeTime wakeTime) {

			v.add(wakeTime);

			try {
				FileOutputStream fos = new FileOutputStream(wakeTimeFile);
				ObjectOutputStream oos = new ObjectOutputStream(fos);

				oos.writeObject(v);

				oos.flush();
				oos.close();
				fos.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (NullPointerException e) {
				e.printStackTrace();
			}

		}

und die Klasse WakeTime: (ist Serializable , genauso wie LocalTime und LocalDateTime aus der joda time bibliothek
Code:
	private class WakeTime implements Serializable {

		private static final long serialVersionUID = -5466187340776272100L;

		private String type = null;

		private LocalDateTime dTime = null;

		private LocalTime time = null;

		public String getType() {
			return type;
		}

		public LocalDateTime getDTime() {
			return dTime;
		}

		public LocalTime getTime() {
			return time;
		}


		WakeTime(String type, LocalDateTime dtime) {

			this.type = type;
			this.dTime = dtime;

		}

		WakeTime(String type, LocalTime time) {

			this.type = type;
			this.time = time;

		}

	}

Wo liegt hier der Fehler?
danke im Vorraus
mfg
 

Ebenius

Top Contributor
Huhu,

ich benutze joda time nicht, aber ich würde folgendes probieren. Mach alle Felder in Deiner Klasse transient und probier's nochmal. Dann nimm das transient bei einem weg und probier's. Bis Du die schuldige Klasse gefunden hast.

Wie sieht denn der StackTrace aus?

Grüße, Ebenius
 

Arbon

Bekanntes Mitglied
Der fehler liegt wohl nicht in der Klasse wakeTime, hab alle mal transient gemacht und es ging immer noch nicht. hier der stackTrace:

Code:
java.io.NotSerializableException: wecken.Wecken
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:416)
	at java.util.Vector.writeObject(Vector.java:1012)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
	at wecken.Wecken$WakeTimeVector.add(Wecken.java:459)
	at wecken.Wecken$WakeTimeVector.access$1(Wecken.java:451)
	at wecken.Wecken$4.actionPerformed(Wecken.java:223)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6134)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
	at java.awt.Component.processEvent(Component.java:5899)
	at java.awt.Container.processEvent(Container.java:2023)
	at java.awt.Component.dispatchEventImpl(Component.java:4501)
	at java.awt.Container.dispatchEventImpl(Container.java:2081)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
	at java.awt.Container.dispatchEventImpl(Container.java:2067)
	at java.awt.Window.dispatchEventImpl(Window.java:2458)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
	at java.awt.Dialog$1.run(Dialog.java:1047)
	at java.awt.Dialog$3.run(Dialog.java:1099)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.Dialog.show(Dialog.java:1097)
	at java.awt.Component.show(Component.java:1447)
	at java.awt.Component.setVisible(Component.java:1400)
	at java.awt.Window.setVisible(Window.java:824)
	at java.awt.Dialog.setVisible(Dialog.java:987)
	at wecken.Wecken.setSWT(Wecken.java:267)
	at wecken.Wecken.access$0(Wecken.java:207)
	at wecken.Wecken$1.actionPerformed(Wecken.java:95)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6134)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
	at java.awt.Component.processEvent(Component.java:5899)
	at java.awt.Container.processEvent(Container.java:2023)
	at java.awt.Component.dispatchEventImpl(Component.java:4501)
	at java.awt.Container.dispatchEventImpl(Container.java:2081)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
	at java.awt.Container.dispatchEventImpl(Container.java:2067)
	at java.awt.Window.dispatchEventImpl(Window.java:2458)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Woran kann es sonst noch liegen, ein Vektor ist ja auch serializable laut API (die von joda sind es auch laut api, siehe hier:
http://joda-time.sourceforge.net/api-release/index.html
)
 

Ebenius

Top Contributor
Arbon hat gesagt.:
Der fehler liegt wohl nicht in der Klasse wakeTime, hab alle mal transient gemacht und es ging immer noch nicht. hier der stackTrace:

Code:
java.io.NotSerializableException: wecken.Wecken

Heieiei jetzt stand ich aber auf dem Schlauch, das hätte ich eher sehen müssen. Also (siehe oben) die Klasse "Wecken" ist nicht serialisierbar. Warum muss "Wecken" serialisierbar sein? Weil sie nicht statisch ist.

Du möchtest bestimmt folgendes machen (static):
Code:
private static class WakeTime implements Serializable {
  ...
}

Und schon funktioniert's. Stimmt's?

Ebenius
 

Arbon

Bekanntes Mitglied
Oh man das hab ich ebenfalls übersehen was jetzt eig der Fehler war. Dachte die ganze zeit die Klasse WakeTime ist schuld.

es lag daran das es eine unterklasse war. Hab jetzt WakeTime als eigene Klasse und jetzt funktionierts einwandfrei (hab aber kein static, möchte ja objekte davon anlegen können).

danke für deine bemühungen

mfg
 

Landei

Top Contributor
hab aber kein static, möchte ja Objekte davon anlegen können

static kann man nur bei inneren Klassen angeben, und *natürlich* kann man Objekte davon anlegen. Der einzige Unterschied ist, dass man nicht mehr auf die Felder oder die "this"-Referenz des äußeren Objekts (aber sehr wohl die static Felder der Klasse) zugreifen kann:

Code:
class Outer {
    int field = 0;
    static int staticField = 1;
    class Inner {
        Inner() { 
           System.out.println(field); //OK
           System.out.println(staticField); //OK
           Outer outer = Outer.this; //OK 
        } 
    }
    static class StaticInner {
        StaticInner() { 
           System.out.println(field); //Nö
           System.out.println(staticField); //OK
           Outer outer = Outer.this; //Nö
        } 
    }
}
 

Ebenius

Top Contributor
Landei hat gesagt.:
hab aber kein static, möchte ja Objekte davon anlegen können

static kann man nur bei inneren Klassen angeben, und *natürlich* kann man Objekte davon anlegen. Der einzige Unterschied ist, dass man nicht mehr auf die Felder oder die "this"-Referenz des äußeren Objekts (aber sehr wohl die static Felder der Klasse) zugreifen kann:

Code:
class Outer {
    int field = 0;
    static int staticField = 1;
    class Inner {
        Inner() { 
           System.out.println(field); //OK
           System.out.println(staticField); //OK
           Outer outer = Outer.this; //OK 
        } 
    }
    static class StaticInner {
        StaticInner() { 
           System.out.println(field); //Nö
           System.out.println(staticField); //OK
           Outer outer = Outer.this; //Nö
        } 
    }
}

Der OP meinte vielleicht, dass er (bezogen auf Dein Beispiel) nicht sagen kann (womit er Recht hat):
Code:
new Outer.Inner()

Was er statt dessen außerhalb "Outer" schreiben müsste (und das sehe ich zum Glück sehr selten):
Code:
// Iiiiiehba!
(new Outer()).new Inner();

Grüße, Ebenius
 
Status
Nicht offen für weitere Antworten.

Oben