2016-08-16 35 views
-1

我一直在使用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類所接受的變量仍然與SampleBall類無關。而且因爲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();(包含上述行的功能)

所有幫助非常感謝,如果你需要任何其他的東西只是問。

謝謝。

+0

'f.createNewFile();'在這裏沒有意義。 '新的FileOutputStream()'已經做到了,所以你迫使它刪除你剛創建的文件並創建另一個文件。在某處,您可以參考正在序列化的這個「Ball」類。堆棧跟蹤來自'writeObject()'調用,而不是它找到的不可序列化的類。 – EJP

+2

如果'StaticBall'或'Dimension'不是可序列化的,或者其中任何一個類包含對不可序列化的類的引用,您將會得到此錯誤。既然你沒有顯示代碼,我們不能真正幫助。您必須遵循序列化主對象中的所有引用鏈。如果您要提供必要的詳細信息,例如錯誤消息和完整的堆棧跟蹤以及所有相關的代碼,它可能會有所幫助。 –

+0

@JimGarrison'靜態球'是可序列化的,但它延伸的類不是。因爲當我讓這個類可序列化時,我得到了上面的錯誤(我現在發佈了完整的錯誤)。我通過從擴展類中除去'implements Serializable'來修復這個問題,但是現在我正需要這個類來實現Serializable。 – Ryan

回答

1

系列化正常,你必須確保所有你要序列化實現Serializable接口的類,我有同樣的問題,一旦我試圖挽救一個對象在同一時間,看看有什麼物體所造成的問題 - 平齊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()'在'close()'之前是多餘的。 – EJP

1

對於序列化/反序列化是成功的,下面兩個條件必須爲真:

  1. 要序列化的類/反序列化必須實現 java.io.Serializable 接口。
  2. 該類別中的所有字段必須是原始類型,或者必須實現接口的 java.io.Serializable

條件1(滿意):因爲 CustomSave implements Serializable

條件2(?):不要StaticBallDragablePlatformStarPolygon實現Serializable?

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

正如你所說,符合條件1,我檢查了所有其他類,我讓他們都實現了Serializable。即使他們中的一個沒有,我也不明白爲什麼它給了我'Sample'內的'Ball'類作爲錯誤。至於上面的答案,我獨立完成了它們,我得到的錯誤是StaticBall。 – Ryan

+0

看來我只是不小心修好了它。類「StaticBall」擴展了另一個類。該類還實現了Serializable。當我注意到這一點,我擺脫了好奇心,並修復它。爲什麼會出現這個問題?爲什麼它會開始將其他隨機課程當作問題來確定,因爲他們實際上與問題無關,並且與課堂沒有直接關係問題?儘管如此,感謝您的幫助。 – Ryan

相關問題