gpt4 book ai didi

Java - NotSerializedException(保存对象)

转载 作者:行者123 更新时间:2023-12-01 11:09:03 25 4
gpt4 key购买 nike

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

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

这是我的 Track 类(class)的一部分。我注意到 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.....

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

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

感谢您的帮助

最佳答案

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

根据 java 文档:

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

关于Java - NotSerializedException(保存对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32586237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com