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.
'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
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. –
@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