java - 自定义对象序列化的ArrayList

标签 java serialization arraylist minecraft bukkit

我的代码中有两个数组列表。一个存储 User 对象,另一个存储 Team 对象。我想做的是,当给出关闭指令时,将两个数组列表保存到文件中,然后关闭程序。

我在保存两个 AL 时遇到问题,但后来我定义了一个serialVersionUID,只有用户 AL 工作正常。我仍然收到来自 AL 团队的错误。

保存时出错:

14:29:46 [SEVERE] java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.bukkit.Location
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readObject(Unknown Source)
14:29:46 [SEVERE]       at java.util.ArrayList.readObject(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.lang.reflect.Method.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectInputStream.readObject(Unknown Source)
14:29:46 [SEVERE]       at plugin.Configs.loadTeams(Configs.java:129)
14:29:46 [SEVERE]       at plugin.UltimateSurvival.onEnable(UltimateSurvival.java:82)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:457)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.loadPlugin(CraftServer.java:284)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.enablePlugins(CraftServer.java:266)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:615)
14:29:46 [SEVERE]       at org.bukkit.Bukkit.reload(Bukkit.java:277)
14:29:46 [SEVERE]       at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23)
14:29:46 [SEVERE]       at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:192)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.dispatchCommand(CraftServer.java:528)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.handleCommand(PlayerConnection.java:968)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.chat(PlayerConnection.java:886)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:837)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.Packet3Chat.handle(SourceFile:49)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.NetworkManager.b(NetworkManager.java:296)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:116)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.DedicatedServerConnection.b(SourceFile:30)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:592)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:227)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:488)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:421)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)
14:29:46 [SEVERE] Caused by: java.io.NotSerializableException: org.bukkit.Location
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject(Unknown Source)
14:29:46 [SEVERE]       at java.util.ArrayList.writeObject(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.lang.reflect.Method.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject(Unknown Source)
14:29:46 [SEVERE]       at plugin.Configs.saveTeams(Configs.java:52)
14:29:46 [SEVERE]       at plugin.UltimateSurvival.onDisable(UltimateSurvival.java:91)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:219)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:481)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:400)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:393)
14:29:46 [SEVERE]       at     org.bukkit.plugin.SimplePluginManager.clearPlugins(SimplePluginManager.java:434)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:585)
14:29:46 [SEVERE]       ... 17 more

加载错误:

14:29:46 [SEVERE] java.io.NotSerializableException: org.bukkit.Location
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject(Unknown Source)
14:29:46 [SEVERE]       at java.util.ArrayList.writeObject(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
14:29:46 [SEVERE]       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.lang.reflect.Method.invoke(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject0(Unknown Source)
14:29:46 [SEVERE]       at java.io.ObjectOutputStream.writeObject(Unknown Source)
14:29:46 [SEVERE]       at plugin.Configs.saveTeams(Configs.java:52)
14:29:46 [SEVERE]       at plugin.UltimateSurvival.onDisable(UltimateSurvival.java:91)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:219)
14:29:46 [SEVERE]       at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:481)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:400)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:393)
14:29:46 [SEVERE]       at org.bukkit.plugin.SimplePluginManager.clearPlugins(SimplePluginManager.java:434)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.reload(CraftServer.java:585)
14:29:46 [SEVERE]       at org.bukkit.Bukkit.reload(Bukkit.java:277)
14:29:46 [SEVERE]       at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23)
14:29:46 [SEVERE]       at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:192)
14:29:46 [SEVERE]       at org.bukkit.craftbukkit.v1_6_R3.CraftServer.dispatchCommand(CraftServer.java:528)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.handleCommand(PlayerConnection.java:96
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.chat(PlayerConnection.java:886)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.a(PlayerConnection.java:837)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.Packet3Chat.handle(SourceFile:49)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.NetworkManager.b(NetworkManager.java:296)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.PlayerConnection.e(PlayerConnection.java:116)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.ServerConnection.b(SourceFile:37)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.DedicatedServerConnection.b(SourceFile:30)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:592)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:227)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:488)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:421)
14:29:46 [SEVERE]       at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)

这是我目前正在开发的 Minecraft 插件的一部分。 一些代码:

public class Team implements Serializable
{
private static final long serialVersionUID = 6482400621090209853L;
private  String name = "";
private  int points = 0;
private  int size = 0;
private Location spawn = null;
}

public void loadTeams()
{
    try{
        FileInputStream file = new FileInputStream ("plugins/UltimateSurvival/teams.bin");
        ObjectInputStream ois = new ObjectInputStream(file);
        UltimateSurvival.teams = (ArrayList<Team>)ois.readObject();
        file.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

public void saveTeams()
{
    try
    {
        FileOutputStream file = new FileOutputStream ("plugins/UltimateSurvival/teams.bin");
        ObjectOutputStream oos = new ObjectOutputStream(file);
        oos.writeObject(UltimateSurvival.teams);
        file.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

我读过一些有关序列化的内容,但这是我第一次接触它。我做错了什么吗?

提前致谢

最佳答案

我刚刚

package tv.usasvideos.survivalgameteams;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SaveLoadList {
    public static void save(Object obj,String path) throws Exception {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path))) {
            oos.writeObject(obj);
            oos.flush();
        }
    }

    public static Object load(String path) throws Exception {
        Object result;
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path))) {
            result = ois.readObject();
        }
        return result;
    }
}

private List<ChestPoint> chestpoints = new ArrayList<>();

@Override
public void onEnable(){
    try {
        chestpoints = (List<ChestPoint>)SaveLoadList.load("chestpoints.bin");
    } catch (Exception ex) {
        Logger.getLogger(SurvivalGame.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void onDisable(){
    try {
        SaveLoadList.save(chestpoints,"chestpoints.bin");
    } catch (Exception ex) {
        Logger.getLogger(SurvivalGame.class.getName()).log(Level.SEVERE, null, ex);
    }
}

关于java - 自定义对象序列化的ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22355116/

相关文章:

java - 如何通过检查其值从 ArrayList 中删除元素?

java - 如何制作 Java ArrayList 的深拷贝

Java 从 listArray 中删除条目

java - 一个简单的java多线程

Java Streams 按最小值/最大值过滤嵌套集合

Java:使用if条件检查char变量的内容

php从序列化数据中获取满足条件的行

java - 如何使用 gmail api 查询已发送的邮件?

c# - 将 C# 类转换为具有自定义结构的 Json

c++ - C++ 中的 boost 序列化 vector