我一直在使用Java幾個月,現在我還是比較新,所以任何幫助表示讚賞。我一直在製作一款遊戲(基於另一款遊戲),並且想要製作關卡編輯器。我無法將信息保存到.ser文件,儘管我在其他類中的其他位置沒有任何問題。錯誤是java.io.NotSerializableException: resources.Sample$Ball
,但它給我的行號與該類無關。我有一個名爲Sample的類,裏面有一個叫做Ball的私人類,所以我非常理解,但它給我提供信息的事實是沒有意義的。 Sample
類從來只在一個類中使用過一次,並不是我遇到錯誤的那個類。我從來沒有遇到過這個類或Ball
子類的問題,因爲它們非常僻靜,很少被使用。NotSerializableException發生在它不應該在的地方
兩個行號的錯誤給我的是: at LevelEditor.saveDialog(LevelEditor.java:309) at LevelEditor.actionPerformed(LevelEditor.java:256)
那些行號的代碼行如下: oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));
這是哪裏的問題實際上是存在的,而其他行號就是我稱之爲上述代碼所在的函數的地方。CustomSave
類所接受的變量仍然與Sample
或Ball
類無關。而且因爲CustomSave
班是如此之小,我也會在這裏提供。我還會爲上面的行號提供背景信息。
語境代碼
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類
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;
}
}
同樣,我不知道爲什麼我得到這個錯誤,因爲它沒有任何意義。爲了嘗試解決問題,我嘗試在Sample
類的Ball
類中實施Serializable
,並且在一定程度上解決了問題。該錯誤停止列出Sample$Ball
作爲問題,而是列出另一個隨機類作爲問題,另一類與我試圖做的事完全沒有關係。
完全錯誤
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)
關卡編輯器線路454
oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));
關卡編輯器線路298
saveDialog();
(包含上述行的功能)
所有幫助非常感謝,如果你需要任何其他的東西只是問。
謝謝。
'f.createNewFile();'在這裏沒有意義。 '新的FileOutputStream()'已經做到了,所以你迫使它刪除你剛創建的文件並創建另一個文件。在某處,您可以參考正在序列化的這個「Ball」類。堆棧跟蹤來自'writeObject()'調用,而不是它找到的不可序列化的類。 – EJP
如果'StaticBall'或'Dimension'不是可序列化的,或者其中任何一個類包含對不可序列化的類的引用,您將會得到此錯誤。既然你沒有顯示代碼,我們不能真正幫助。您必須遵循序列化主對象中的所有引用鏈。如果您要提供必要的詳細信息,例如錯誤消息和完整的堆棧跟蹤以及所有相關的代碼,它可能會有所幫助。 –
@JimGarrison'靜態球'是可序列化的,但它延伸的類不是。因爲當我讓這個類可序列化時,我得到了上面的錯誤(我現在發佈了完整的錯誤)。我通過從擴展類中除去'implements Serializable'來修復這個問題,但是現在我正需要這個類來實現Serializable。 – Ryan