0

我正在开发一个插件,它将在操作期间使用的 hashmap 中存储氏族(氏族类对象)。hasmap 将存储在一个文件中(将 hashmap 作为一个整体序列化是理想的,但我不确定这是否可能)供以后使用并重新加载。

我应该如何去保存对象?我可以序列化整个哈希图吗?提前致谢; 我是哈希图的新手:P

4

4 回答 4

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/)。

于 2013-04-01T22:16:59.147 回答
1

是的,您可以序列化HashMap对象,因为该类已经实现了Serializable接口。从HashMap文档中:

公共类 HashMap 扩展 AbstractMap 实现 Map、Cloneable、Serializable

请注意,您的Clan类必须实现Serializable接口才能被序列化。如果您打算使用Clan该类作为地图中的键,则它必须覆盖hashCodeandequals方法。

于 2013-04-01T22:10:15.523 回答
1

当然可以,因为 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();
于 2013-04-01T22:13:10.437 回答
1

只要 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.

于 2013-04-01T22:15:06.017 回答