2016-08-16 3 views
-1

Ich arbeite seit ein paar Monaten mit Java und bin immer noch ziemlich neu dazu, so dass jede Hilfe geschätzt wird. Ich arbeite seit einiger Zeit an einem Spiel (basierend auf einem anderen Spiel) und wollte einen Level Editor erstellen. Ich habe Probleme, die Informationen in einer .ser-Datei zu speichern, obwohl ich es an anderen Stellen in anderen Klassen ohne Problem mache. Der Fehler ist java.io.NotSerializableException: resources.Sample$Ball, aber die Zeilennummer, die es mir gibt, hat nichts mit dieser Klasse zu tun. Ich habe eine Klasse namens Sample, und darin gibt es eine private Klasse namens Ball, also verstehe ich das sehr, aber die Tatsache, dass es mir Informationen gibt, macht keinen Sinn. Die Sample Klasse wird immer nur einmal in einer einzigen Klasse verwendet, und es ist nicht die, in der ich den Fehler erhalte. Ich hatte nie Probleme mit dieser Klasse oder der Ball Unterklasse, weil sie sehr abgelegen sind und nur selten benutzt werden.NotSerializableException tritt auf, wo es nicht sein sollte

Die beiden Zeilennummern der Fehler gibt mir sind: at LevelEditor.saveDialog(LevelEditor.java:309) at LevelEditor.actionPerformed(LevelEditor.java:256)

Die Codezeilen an diesen Zeilennummern sind wie folgt: oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));

Welche ist, wo das Problem tatsächlich auftreten, und die andere Zeilennummer ist nur, wo ich die Funktion, dass der obige Code liegt, nennen. Die Variablen, die die CustomSave Klasse nimmt noch nichts mit den Sample oder Ball Klassen zu tun haben. Und weil die CustomSave Klasse so klein ist, werde ich das auch hier zur Verfügung stellen. Ich werde auch einen Kontext für die obige Zeilennummer bereitstellen.

Context-Code

try { 
    File f = new File(filename); 
    f.createNewFile(); 
    FileOutputStream fos = new FileOutputStream(f); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(new CustomSave(platforms, stars, ball, levelSize)); 
    oos.close(); 
} catch (Exception e1) { 
    e1.printStackTrace(); 
} 

CustomSave Klasse

package resources; 

import java.awt.Dimension; 
import java.io.*; 
import java.util.ArrayList; 
import resources.BouncyBall; 

public class CustomSave implements Serializable { 
    private ArrayList<DragablePlatform> platforms; 
    private ArrayList<StarPolygon> stars; 

    private StaticBall ball; 
    private Dimension levelSize; 

    public CustomSave(ArrayList<DragablePlatform> platforms, ArrayList<StarPolygon> stars, StaticBall ball, Dimension levelSize){ 
     this.platforms = platforms; this.stars = stars; this.ball = ball; this.levelSize = levelSize; 
    } 

    public ArrayList<DragablePlatform> getPlatforms() { 
     return platforms; 
    } 
    public ArrayList<StarPolygon> getStars() { 
     return stars; 
    } 
    public BouncyBall getBall() { 
     return ball; 
    } 
    public Dimension getLevelSize() { 
     return levelSize; 
    } 
} 

Auch ich weiß nicht, warum ich diesen Fehler, weil es keinen Sinn macht. Um die Fehlerbehebung zu versuchen, habe ich versucht, Serializable auf der Ball Klasse innerhalb der Sample Klasse zu implementieren und das Problem in einem gewissen Umfang behoben. Der Fehler hörte auf, Sample$Ball als das Problem aufzulisten, aber nannte stattdessen eine andere zufällige Klasse als das Problem, eine andere Klasse, die absolut nichts mit dem hat, was ich versuche zu tun.

Full Error

java.io.NotSerializableException: resources.Sample$Ball 
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.GeneratedMethodAccessor11.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.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.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 LevelEditor.saveDialog(LevelEditor.java:454) 
at LevelEditor.actionPerformed(LevelEditor.java:298) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.AbstractButton.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

Level Editor Linie 454

oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));

Level Editor Linie 298

saveDialog(); (Die Funktion, die die obige Zeile enthält)

Alle Hilfe wird sehr geschätzt, und wenn Sie etwas anderes brauchen, fragen Sie einfach.

Vielen Dank.

+0

'f.createNewFile();' ist hier sinnlos. 'new FileOutputStream()' macht es bereits, also zwingst du es, die soeben erstellte Datei zu löschen und eine andere zu erstellen. Irgendwo haben Sie einen Bezug zu dieser Klasse "Ball", die serialisiert wird. Der Stack-Trace stammt vom 'writeObject()' -Aufruf, nicht von der nicht-serialisierbaren Klasse, die er gefunden hat. – EJP

+2

Sie erhalten diesen Fehler, wenn 'StaticBall' oder' Dimension' nicht serialisierbar ist oder wenn eine dieser Klassen Verweise auf nicht serialisierbare Klassen enthält. Da Sie den Code nicht gezeigt haben, können wir nicht wirklich helfen. Sie müssen ALLE Referenzketten vom Hauptobjekt, das serialisiert wird, folgen. Wenn Sie die notwendigen Details wie die Fehlermeldungen und den vollständigen Stack-Trace zusammen mit dem entsprechenden Code bereitstellen würden, könnte dies hilfreich sein. –

+0

@JimGarrison 'Static Ball' ist serialisierbar, die Klasse wird jedoch nicht erweitert. Weil, wenn ich diese Klasse serialisierbar mache, bekomme ich den Fehler oben (ich habe den vollen Fehler jetzt veröffentlicht). Ich habe das behoben, indem ich die 'serializable' -Implementierung aus der erweiterten Klasse entfernt habe, aber jetzt bin ich an einem Punkt, an dem diese Klasse serialisiert werden muss. – Ryan

Antwort

1

zu Serialisierung richtig müssen Sie sicher, alle Klassen machen Sie serialisiert werden, um den Serializable-Schnittstelle zu implementieren, hatte ich das gleiche Problem, wenn ich versuchte, ein Objekt zu einer Zeit, zu speichern und sehen, welches Objekt verursachte das Problem - bündig die oos.

try {   
    FileOutputStream fos = new FileOutputStream(new File(filename)); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(platforms); 
    oos.writeObject(stars); 
    oos.writeObject(balls); 
    oos.writeObject(levelSize); 
    oos.flush(); 
    oos.close(); 
}catch (Exception e1) { 
    e1.printStackTrace(); 
} 
+1

'flush()' ist redundant vor 'close()'. – EJP

1

für die Serialisierung/Deserialisierung erfolgreich zu sein, die beiden folgenden Bedingungen müssen erfüllt sein:

  1. Die Klasse, die Sie serialisieren möchten/deserialisieren die java.io.Serializable Schnittstelle implementieren müssen.
  2. Alle Felder in dieser Klasse müssen entweder primitive Typen sein oder die java.io.Serializable Schnittstelle implementieren.

Zustand 1 (sehr zufrieden): seit CustomSave implements Serializable

Bedingung 2 (?): Sie StaticBall, DragablePlatform und StarPolygon Serializable implementieren?

private ArrayList<DragablePlatform> platforms; // ArrayList implements Serializable? Yes, DragablePlatform implements Serializable? 
private ArrayList<StarPolygon> stars; // ArrayList implements Serializable? Yes, StartPolygon implements Serializable? 
private StaticBall ball; // StaticBall implements Serializable? 
private Dimension levelSize; // Dimension implements Serializable? Yes 
+0

Wie Sie gesagt haben, ist Bedingung 1 erfüllt, und ich überprüfte alle anderen Klassen und ich ließ sie alle Serializable implementieren. Und selbst wenn einer von ihnen nicht verstanden hat, verstehe ich nicht, warum es mir die 'Ball'-Klasse in' Sample' als Fehler gibt. Und was die Antwort über dir betrifft, habe ich sie alle unabhängig gemacht und der Fehler, den ich bekomme, ist mit StaticBall. – Ryan

+0

Es scheint, ich habe es nur versehentlich behoben. Die Klasse 'StaticBall' erweitert eine andere Klasse. Diese Klasse implementierte auch Serializable. Als ich das bemerkte, habe ich das aus Neugierde losgeworden und es repariert. Warum wäre das das Problem gewesen, und warum würde es beginnen, andere zufällige Klassen als das Problem zu identifizieren, wenn sie tatsächlich nichts mit dem Problem zu tun hatten und keine direkte Beziehung zu der Klasse hatten, die das Problem darstellte? Trotzdem, danke für Ihre Hilfe. – Ryan

Verwandte Themen