Я работаю с 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;
}
}
Опять же, я не знаю, почему я получаю эту ошибку, потому что это не имеет никакого смысла. Чтобы попробовать устранить неполадки, я попытался реализовать 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)
Level Editor Line 454
oos.writeObject(new CustomSave(platforms, stars, ball, levelSize));
Level Editor Line 298
saveDialog();
(Функция, которая содержит указанную выше строку)
Вся помощь очень ценится, и если вам нужно что-то еще, просто спросите.
спасибо.
'f.createNewFile();' здесь бессмысленно. 'new FileOutputStream()' уже делает это, поэтому вы вынуждаете его удалить только что созданный файл и создать еще один. Где-то у вас есть ссылка на этот класс «Ball», который сериализуется. Трассировка стека происходит из вызова 'writeObject()', а не несериализуемого класса, который он нашел. – EJP
Вы получите эту ошибку, если 'StaticBall' или' Dimension' не сериализуемы, или если какой-либо из этих классов содержит ссылки на несериализуемые классы. Поскольку вы не показали код, мы не можем помочь. Вы должны следовать ВСЕ целям ссылок от сериализации основного объекта. Если вы предоставите необходимые данные, такие как сообщения об ошибках и полную трассировку стека, а также весь соответствующий код, который может помочь. –
@ JimGarrison 'Static Ball' является сериализуемым, класс, который он распространяет, однако, не является. Потому что, когда я делаю этот сериализуемый класс, я получаю ошибку выше (теперь я отправил полную ошибку). Я «исправил» это, удалив «реализует Serializable» из расширенного класса, но теперь я нахожусь в точке, где мне нужен этот класс для Serializable. – Ryan