-1

私は Java を使って数か月になりますが、まだまったくの初心者なので、助けていただければ幸いです。私はしばらくの間 (別のゲームに基づいて) ゲームに取り組んでおり、レベル エディターを作成したいと考えていました。情報を .ser ファイルに保存するのに問題がありますが、他のクラスの他の場所では問題なく保存できます。エラーは ですjava.io.NotSerializableException: resources.Sample$Ballが、それが私に与えている行番号はそのクラスとは何の関係もありません。Sampleというクラスがあり、その中にBallというprivateクラスがあるのでそこまではわかるのですが、それが情報を与えてくれるというのは意味がありません。このSampleクラスは 1 つのクラスで 1 回しか使用されず、エラーが発生したクラスではありません。このクラスまたはBallサブクラスで問題が発生したことはありません。

エラーが私に与える2つの行番号は次のとおりです。 at LevelEditor.saveDialog(LevelEditor.java:309) at LevelEditor.actionPerformed(LevelEditor.java:256)

これらの行番号のコード行は次のとおりです。 oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));

これは実際に問題が発生している場所であり、他の行番号は、上記のコードが含まれている関数を呼び出している場所です。クラスが受け取る変数は、クラスまたはクラスCustomSaveとは関係ありません。また、クラスが非常に小さいため、ここでも提供します。上記の行番号にもコンテキストを提供します。SampleBallCustomSave

コンテキストからコードへ

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;
    }
}

繰り返しますが、意味がないため、なぜこのエラーが発生するのかわかりません。トラブルシューティングを試みるためSerializableに、Ballクラス内のSampleクラスに実装してみましたが、問題はある程度修正されました。エラー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();(上記の行を含む関数)

すべてのヘルプは大歓迎です。他に何か必要な場合はお問い合わせください。

ありがとうございました。

4

2 に答える 2

1

シリアライゼーション/デシリアライゼーションが成功するには、次の 2 つの条件が満たされている必要があります。

  1. シリアル化/逆シリアル化するクラスは、インターフェイスを実装する必要があり java.io.Serializable ます。
  2. そのクラスのすべてのフィールドは、プリミティブ型であるか、 java.io.Serializableインターフェイスを実装する必要があります。

条件 1 (満足): 以来 CustomSave implements Serializable

条件 2 (?):実行しStaticBall、SerializableDragablePlatformを実装しますか?StarPolygon

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
于 2016-08-16T02:54:30.243 に答える
1

シリアライズを適切に行うには、シリアライズしようとしているすべてのクラスが Serializable インターフェイスを実装していることを確認する必要があります。一度に 1 つのオブジェクトを保存して、問題の原因となったオブジェクトを確認しようとすると、同じ問題が発生しました - 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();
}
于 2016-08-16T01:51:46.913 に答える