我正在开发一个插件,它将clans(Clan类对象)存储在一个hashmap中,以便在操作期间使用。 hasmap将存储在一个文件中(整个序列化hashmap是理想的,但我不确定这是否可行)以后再重新加载。
我应该如何保存对象?我可以序列化整个hashmap吗?提前致谢;我是hashmaps的新手:P
答案 0 :(得分:2)
HashMap本身实现了Serializable,因此如果键和值都可序列化,您可以序列化整个HashMap。首先,您必须决定使用哪个密钥。键可以是任何对象,但必须实现equals(..)和hashCode()方法,以便可以在HashMap中标识键。
在您的情况下,您可以使用Clan名称作为表示为String对象的键。此外,Clan应该实现Serializable(或Externalizable)。
public class Clan
implements Serializable
{
...
}
按如下方式创建HashMap(使用Java 1.5或更高版本):
Map<String, Clan> clans = new HashMap<String, Clan>();
将其序列化为如下文件:
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(clans);
oos.close();
使用ObjectInputStream对其进行反序列化。 Java序列化过程非常缓慢,因此如果速度是一个问题,您应该检查替代序列化技术。 Kryo是一个非常简单快速的序列化库(https://code.google.com/p/kryo/)。
答案 1 :(得分:1)
是的,您可以序列化HashMap
个对象,因为该类已经实现了Serializable
接口。来自HashMap
文档:
公共类HashMap扩展AbstractMap实现Map,Cloneable,Serializable
请注意,您的Clan
类必须实现Serializable
接口才能进行序列化。如果您要在地图中使用Clan
类作为键,则必须覆盖hashCode
和equals
方法。
答案 2 :(得分:1)
当然可以,因为HashMap是可序列化的。不要忘记make Clan
也可序列化
写入文件:
FileOutputStream fos = new FileOutputStream("clans");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(clans);
oos.close();
从文件中读取:
FileInputStream fis = new FileInputStream("clans");
ObjectInputStream ois = new ObjectInputStream(fis);
HashMap<String, Clan> clans = (HashMap) ois.readObject();
ois.close();
答案 3 :(得分:1)
只要地图中的所有项目都实现Serializable
,您就可以轻松使用Java的内置序列化,这是一个简单的示例:
public static void main(String[] args) throws IOException, ClassNotFoundException {
final Map<Serializable, Serializable> myMap = new HashMap<>();
final File myFile = new File("/path/to/file");
try (final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(myFile))) {
oos.writeObject(myMap);
}
final Map<Serializable, Serializable> myReadMap;
try (final ObjectInputStream ois = new ObjectInputStream(new FileInputStream(myFile))) {
myReadMap = (Map<Serializable, Serializable>) ois.readObject();
}
}
Map myMap
包含Serializable
个键和值,会保存到文件中,然后从文件中读取myReadMap
。