Java - NotSerializableException(保存对象)

时间:2015-09-15 12:34:42

标签: java object serializable saving-data

所以今天我正在开发一个Minecraft服务器的插件。为此,我创建了一个" Track"代表赛道的类。为了存储所有现有轨道及其数据,我想保存整个轨道对象,这使我更容易。总之,我在我的Track类中实现了Serializable,以便稍后使用ObjectOutputStream。当我开始保存轨道时,Java会创建一个对象文件,但它也会给我一个警告/错误:

  

14:19:00] [服务器线程/ WARN]:java.io.NotSerializableException:org.bukkit.craftbukkit.v1_8_R2.CraftWorld   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)   [14:19:00] [服务器线程/ WARN]:在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)   [14:19:00] [服务器线程/警告]:在de.avarion.speedrunners.Main.saveTracks(Main.java:206)   [14:19:00] [服务器线程/警告]:在de.avarion.speedrunners.Main.onDisable(Main.java:48)   [14:19:00] [服务器线程/ WARN]:at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:323)   [14:19:00] [服务器线程/警告]:at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:359)   [14:19:00] [服务器线程/ WARN]:at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:424)   [14:19:00] [服务器线程/警告]:at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:417)   [14:19:00] [服务器主题/警告]:at org.bukkit.craftbukkit.v1_8_R2.CraftServer.disablePlugins(CraftServer.java:335)   [14:19:00] [服务器线程/警告]:在net.minecraft.server.v1_8_R2.MinecraftServer.stop(MinecraftServer.java:458)   [14:19:00] [服务器线程/警告]:在net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer.java:590)   [14:19:00] [服务器线程/ WARN]:在java.lang.Thread.run(Thread.java:745)

这是我的Track课程的一部分。我注意到eclipse警告我轨道类没有声明最终的静态serialVersionUID字段。我试图实现默认和生成的serialVersionUID,但我没有帮助:

import java.io.Serializable;
import java.util.ArrayList;

import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;

public class Track implements Serializable {

private int playerSize;

private String name;
private World world;
private ArrayList<Player> players;
private Location spawn;

private Sign sign;
private Material finishBlocks;
private Material speedBlocks;

public Track(World world, String name, int playerSize) {
    this.world = world;
    this.name = name; 
    this.playerSize = playerSize;
    this.players = new ArrayList<Player>();
}
//and so on.....

现在,这是我保存轨道对象的Code snipet:

private void saveTracks() {
    FileOutputStream outputStream = null;
    ObjectOutputStream objectOutput = null;
    try {
        File directory = new File("tracks");
        if(!directory.exists()) directory.mkdir();
        for(Track track : tracks) {
            outputStream = new FileOutputStream("tracks/" + track.getName() + ".ser");
            objectOutput = new ObjectOutputStream(outputStream);
            objectOutput.writeObject(track);
        }
    }
    catch (IOException e) {
          e.printStackTrace();
    }
    finally {
          if (objectOutput != null) try { objectOutput.close(); } catch (IOException e) {}
          if (outputStream != null) try { outputStream.close(); } catch (IOException e) {}
    }
}

就像我说Java创建对象所以它有点工作。但我不知道如何摆脱警告。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

由于某些实例字段未序列化,因此抛出此异常。所以请检查所有实例变量。如果序列化不需要某些实例变量,请将transient添加到变量中。

根据java doc:

当实例需要具有Seri​​alizable接口时抛出。序列化运行时或实例的类可以抛出此异常。参数应该是类的名称。