java - 使用 ObjectOutputStream 保存 HashMap

标签 java serialization objectoutputstream bukkit

为了根据命令保存传送点,我有一个HashMap:

public HashMap<Player, Location> mapHomes = new HashMap<>();

访问方式如下:

if(cmd.getName().equalsIgnoreCase("sethome")){
    Location loc = player.getLocation();
    mapHomes.put(player, loc);
    sender.sendMessage("Home set !");
    return true;
}
if(cmd.getName().equalsIgnoreCase("home")){
    Location loc1 = mapHomes.get(player);
    player.teleport(loc1);
    sender.sendMessage("Teleported to home");
    return true;
}
return false;

由于这些设置应该在重启时保留,所以我实现了一个保存方法:

public void save(HashMap<Player,Location> mapHome, String path) throws NotSerializableException{
    try{
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
        oos.writeObject(mapHome);
        oos.flush();
        oos.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

但它不起作用。它抛出 NotSerializableException

我觉得主要问题是PlayerLocation不是可序列化的类型,那么这个HashMap应该怎么写呢?

最佳答案

HashMap 已经Serializable

问题是 map 中的对象不是,因此您也必须使它们可序列化。

public class SerializedPlayer extends Player implements Serializable {
    public SerializedPlayer() {}
    public SerializedPlayer(Player playerToClone) {
        this.setField1(playerToClone.getField1());
        // Set all the fields
    }
}

添加到 map 时:

map.put(new SerializedPlayer(player), new SerializedLocation(location));

关于java - 使用 ObjectOutputStream 保存 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11897593/

相关文章:

java - 如何将点对象写入文本文件

java - 如何在棋盘游戏中序列化(反序列化)改变游戏规则的纸牌行为?

c# - 从 C# 中的文件反序列化 Json

从服务器向客户端发送 HashMap 时发生 Java 空指针异常

java - 库路径不应该默认为工作区路径吗?

python - 在 Python 中将对象保存到 JSON 或 XML 文件中

java - 在 Java 中重用 ObjectOutputStreams

java - 如何对字母数字字符串进行排序

java - 限制java应用程序的内存和cpu使用

java - 在 jdbc url 中设置用户变量