java - 使用自定义序列化对象序列化 HashMap

标签 java serialization java-8

我在 ActionHandler 类中声明 HashMap:

public class ActionHandler {
    private HashMap<Cooldown, Long> cooldowns = new HashMap<Cooldown, Long>();

    public void disInit(Main main) throws FileNotFoundException, IOException{
        String path = main.getDataFolder() + File.separator + "cooldowns.dat";
        File serialize = new File(path);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serialize));
        oos.writeObject(cooldowns);
        oos.flush();
        oos.close();
        serialize.createNewFile();
    }
}

 

public class Cooldown implements Serializable{
    private static final long serialVersionUID = 2233153996259053084L;
    private String username;
    private Shop shop;
    public Cooldown(String username, Shop shop){
        //constructing setting the fields...
    }
    public String getUsername(){//returning the fields
    public Shop getShop(){//return shop;}
}

只要插件序列化文件(使用 disInit),控制台就会发出此错误。我很兴奋,因为我已经为我的冷却类实现了 Serialized。

[21:16:29 WARN]: java.io.NotSerializableException: com.gmail.ketracoder.vts.Main

[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputS
tream.java:1184)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.defaultWriteFields(ObjectO
utputStream.java:1548)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeSerialData(ObjectOutp
utStream.java:1509)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeOrdinaryObject(Object
OutputStream.java:1432)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputS
tream.java:1178)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.defaultWriteFields(ObjectO
utputStream.java:1548)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeSerialData(ObjectOutp
utStream.java:1509)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeOrdinaryObject(Object
OutputStream.java:1432)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputS
tream.java:1178)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject(ObjectOutputSt
ream.java:348)
[21:16:29 WARN]:        at java.util.HashMap.internalWriteEntries(HashMap.java:1
776)
[21:16:29 WARN]:        at java.util.HashMap.writeObject(HashMap.java:1354)
[21:16:29 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native M
ethod)
[21:16:29 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMet
hodAccessorImpl.java:62)
[21:16:29 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Deleg
atingMethodAccessorImpl.java:43)
[21:16:29 WARN]:        at java.lang.reflect.Method.invoke(Method.java:483)
[21:16:29 WARN]:        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStr
eamClass.java:988)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeSerialData(ObjectOutp
utStream.java:1496)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeOrdinaryObject(Object
OutputStream.java:1432)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputS
tream.java:1178)
[21:16:29 WARN]:        at java.io.ObjectOutputStream.writeObject(ObjectOutputSt
ream.java:348)
[21:16:29 WARN]:        at com.gmail.ketracoder.vts.Shop.ActionHandler.disInit(A
ctionHandler.java:39)
[21:16:29 WARN]:        at com.gmail.ketracoder.vts.Main.onDisable(Main.java:165
)
[21:16:29 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlug
in.java:323)
[21:16:29 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin
(JavaPluginLoader.java:359)
[21:16:29 WARN]:        at org.bukkit.plugin.SimplePluginManager.disablePlugin(S
implePluginManager.java:424)
[21:16:29 WARN]:        at org.bukkit.plugin.SimplePluginManager.disablePlugins(
SimplePluginManager.java:417)
[21:16:29 WARN]:        at org.bukkit.craftbukkit.v1_8_R1.CraftServer.disablePlu
gins(CraftServer.java:334)
[21:16:29 WARN]:        at net.minecraft.server.v1_8_R1.MinecraftServer.stop(Min
ecraftServer.java:430)
[21:16:29 WARN]:        at net.minecraft.server.v1_8_R1.MinecraftServer.run(Mine
craftServer.java:561)
[21:16:29 WARN]:        at java.lang.Thread.run(Thread.java:745)

我唯一一次在 HashMap 中放入一些东西,就是当我调用时:

private void setCooldown(Player player, int slot, Main main, Shop shop){
        String playerName = player.getName();
        Cooldown cooldown = new Cooldown(playerName, shop);
        cooldowns.put(cooldown, System.currentTimeMillis());
}

最佳答案

The Cooldown class is what is causing the problem

不,Main 类是导致问题的原因,正如异常所示:

java.io.NotSerializableException: com.gmail.ketracoder.vts.Main

显然 CooldownMain 的内部类,因此它保留对封闭对象的引用,该对象不可序列化。使其成为静态类,或外部类。

注意,在调用 createNewFile() 的地方调用它会产生一个零长度文件。您不需要在任何地方执行此操作:new FileOutputStream(...) 已经执行此操作。只需删除它即可。

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

相关文章:

java - Lucene 句子搜索

java - 如何在 Java 中测试一个类是否正确实现了 Serializable(不仅仅是 Serializable 的实例)

Java 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则不同的键

java - 当我们使用 super 时,为什么 Java 8::operator 不能用于 Object hashcode 方法?

java - 我可以用 Jython/Python 扩展 Jenkins 吗

java - JDO (Google App Engine) 中的持久列表

java - SQLiteDatabase 中的 SimpleCursorAdapter 游标在 Spinner 适配器中无法正确显示

c# - 使用 newtonsoft 将 json 字符串反序列化为 c# 对象

.net - 根据其属性之一将对象序列化为 null

java - Java 8 中的这个 lambda 特性是如何工作的?