【问题标题】:Java - NotSerializableException (saving an object)Java - NotSerializableException(保存对象)
【发布时间】:2015-12-11 17:16:57
【问题描述】:

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

14:19:00] [服务器线程/警告]:java.io.NotSerializableException:org.bukkit.craftbukkit.v1_8_R2.CraftWorld [14:19:00] [服务器线程/警告]:在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) [14:19:00] [服务器线程/警告]:在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) [14:19:00] [服务器线程/警告]:在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) [14:19:00] [服务器线程/警告]:在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) [14:19:00] [服务器线程/警告]:在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) [14:19:00] [服务器线程/警告]:在 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] [服务器线程/警告]:在 org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:323) [14:19:00] [服务器线程/警告]:在 org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:359) [14:19:00] [服务器线程/警告]:在 org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:424) [14:19:00] [服务器线程/警告]:在 org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:417) [14:19:00] [服务器线程/警告]:在 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] [服务器线程/警告]:在 java.lang.Thread.run(Thread.java:745)

这是我的 Track 课程的一部分。我注意到 eclipse 警告我 track 类没有声明最终的静态 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.....

现在,这是我保存轨道对象的代码片段:

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 创建了对象,所以它有点工作。但我不知道如何摆脱警告。

感谢您的帮助

【问题讨论】:

    标签: java object serializable saving-data


    【解决方案1】:

    由于某些实例字段未序列化而引发此异常。所以请检查所有实例变量。如果某些实例变量不需要序列化,请在该变量中添加transient

    根据 java 文档:

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

    【讨论】:

    • @VGR 请在评论前阅读。我要求输入不需要的字段。
    • 好的,所以我发现错误是由来自 api 的字段引起的,并且它们没有被序列化。所以问题是对它们进行序列化,因为我不想遗赠每一堂课
    • @AvarionDE 这个帖子对你有帮助吗
    • 抱歉,它没有帮助。就像我说的那样,我正在使用来自外部 api 的类,并且它们还没有实现 Serializable,所以我无法保存包含这些字段的跟踪对象
    猜你喜欢
    • 2012-10-09
    • 2014-01-31
    • 2023-04-03
    • 2014-07-23
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多