我正在开发一个插件,它将在操作期间使用的 hashmap 中存储氏族(氏族类对象)。hasmap 将存储在一个文件中(将 hashmap 作为一个整体序列化是理想的,但我不确定这是否可能)供以后使用并重新加载。
我应该如何去保存对象?我可以序列化整个哈希图吗?提前致谢; 我是哈希图的新手:P
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/)。
是的,您可以序列化HashMap
对象,因为该类已经实现了Serializable
接口。从HashMap
文档中:
公共类 HashMap 扩展 AbstractMap 实现 Map、Cloneable、Serializable
请注意,您的Clan
类必须实现Serializable
接口才能被序列化。如果您打算使用Clan
该类作为地图中的键,则它必须覆盖hashCode
andequals
方法。
当然可以,因为 HashMap 是可序列化的。不要忘记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();
只要 map 中的所有项目都实现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
.