Java序列化失败抛出java.io.NotSerializableException问题求助
序列化对象时抛出java.io.NotSerializableException异常
尝试序列化Player对象时,程序持续抛出java.io.NotSerializableException,参考了若干在线教程仍未定位到问题。
Save类代码
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class Save { public static ArrayList<String> Saves = new ArrayList<String>(); private static final String filePath = "/Users/carlgombert/eclipse-workspace/CerberusCryptSwing/saves/"; public Save() { } public void SaveGame(String name) throws FileNotFoundException, IOException{ String fileName = (filePath + name + ".svr"); FileOutputStream userSaveFile = new FileOutputStream(fileName); ObjectOutputStream playerSaver = new ObjectOutputStream(userSaveFile); playerSaver.writeObject(Main.player); userSaveFile.close(); playerSaver.close(); LoadGame(name); } public void LoadGame(String name) throws FileNotFoundException, IOException{ String fileName = (filePath + name + ".svr"); FileInputStream userLoadFile = new FileInputStream(fileName); ObjectInputStream playerLoader = new ObjectInputStream(userLoadFile); try { Main.player = (Player)playerLoader.readObject(); } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); } userLoadFile.close(); playerLoader.close(); System.out.println(Main.player); } }
Player类代码
import java.io.Serializable; import java.util.*; public class Player implements Serializable{ static ArrayList<Weapon> weapons = new ArrayList<Weapon>(); static ArrayList<Consumable> consumables = new ArrayList<Consumable>(); private int health; private int gold; private static int damage; private Location location; private static final long serialVersionUID = 3L; public Player(int health, int gold, Location location){ this.health = health; this.gold = gold; this.location = location; damage = 20; } public Location getLocation(){ return location; } public void setLocation(Location location){ this.location = location; } public int getDamage(){ return damage; } public int getHealth(){ return health; } public void setHealth(int health){ this.health = health; if(this.health > 100){ this.health = 100; } } public int getGold(){ return gold; } public void setGold(int gold){ this.gold = gold; } public void addGold(int gold){ this.gold += gold; } public void addConsumable(Consumable consumable){ consumables.add(consumable); } public void clearConsumables(){ consumables.clear(); } public void wipeInventory(){ consumables.clear(); weapons.clear(); } public void eat(int i){ health += consumables.get(i).getHealing(); if(health > 100){ health = 100; } consumables.remove(i); } public void consumableMenu(){ int i = 0; for(Consumable x: consumables){ System.out.println("[" + (i + 1) + "]" + x.getName() + "(healing: " + x.getHealing() + ")"); i++; } } public void damage(int damage){ health = health - damage; } public void attack(Mob mob){ mob.damage(damage); } public void inventory(){ if(weapons.size() == 0 && consumables.size() == 0){ System.out.println("empty"); } else{ for(Weapon x: weapons){ System.out.println(x); } for(Consumable x: consumables){ System.out.println(x); } } } public static void addWeapon(Weapon weapon){ weapons.add(weapon); } public String toString() { return "health: " + health + ", gold: " + gold; } }
序列化调用代码
if(e.getSource()==saveEnterButton) { try { save.SaveGame(saveTextField.getText()); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } saveTextField.setText(""); }
错误堆栈信息
java.io.NotSerializableException: sun.awt.image.ToolkitImage at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1197) at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1582) at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1539) at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1448) at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191) at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1582) at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1539) at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1448) at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191) at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354) at com.cerberuscryptswing.main.Save.SaveGame(Save.java:24) at com.cerberuscryptswing.main.Frame.actionPerformed(Frame.java:245) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313) at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6626) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389) at java.desktop/java.awt.Component.processEvent(Component.java:6391) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
问题分析与解决
错误堆栈明确指向sun.awt.image.ToolkitImage无法序列化,这个类是AWT的图片实现类,本身不支持序列化。
问题根源:
- Player类持有
Location类型的成员变量,Location类中大概率包含了ToolkitImage类型的对象(比如场景图片),且Location类未实现Serializable接口,或者虽实现了接口但未将图片成员标记为transient。 - Player类中的
Weapon、Consumable类如果未实现Serializable,后续也会触发同样的异常(静态集合本身不参与序列化,但集合中的元素如果是对象,在反序列化或后续操作中可能引发问题)。
解决步骤:
- 检查
Location类,确保它实现Serializable接口;若其中包含图片等不可序列化对象,用transient关键字修饰这些成员,序列化时会自动跳过transient字段。 - 确保
Weapon、Consumable、Mob所有被Player引用的类都实现Serializable接口,且它们的成员变量中无不可序列化对象,必要时用transient处理。 - 注意:静态成员不属于对象实例,不会被序列化。如果需要保存
weapons、consumables这类静态集合的内容,需改为非静态成员,或单独处理静态数据的序列化逻辑。
内容的提问来源于stack exchange,提问作者Carl Gombert
相关产品推荐
相关产品推荐

