【发布时间】:2011-11-08 00:38:30
【问题描述】:
从事一个项目已经有一段时间了,我遇到了一些不同的复杂情况和解决方案,但似乎并没有一起成功。
final public class place implements Serializable {
private static final long serialVersionUID = -8851896330953573877L;
String world;
Double X;
Double Y;
Double Z;
}
HashMap<place, Long> blockmap = new HashMap<place, Long>(); // does not work
HashMap<Location, Long> blockmap = new HashMap<Location, Long>(); //works
首先,我的哈希图是一个哈希图,其中包含一个项目被放置(或添加)到世界的时间。 place 是一个包含字符串 world、double x、double y、double z 的 'class place {}';我遇到的问题是它不适用于哈希图。我可以使用它存储一个新的哈希键,但我不能调用来获取它的值。改用 Location 可以解决这个问题(哈希图)并且可以完美运行。
public void SetBlock(Block block) {
Location loc = new Location(null, block.getLocation().getX(),block.getLocation().getY(),block.getLocation().getZ());
//...
Long time = (long) (System.currentTimeMillis() / 60000);
//...
if (blockmap.containsKey(loc)) {
blockmap.remove(loc);
blockmap.put(loc, time);
//System.out.println("MyLeveler: Block Existed, Updated");
} else {
blockmap.put(loc, time);
//System.out.println("MyLeveler: Block added to " + loc.getX() + ", " + loc.getY() + ", " + loc.getZ());
//System.out.println("MyLeveler: total blocks saved: " + blockmap.size());
}
}
这可以正常工作。现在,为此目的,必须在禁用和启用插件时保存并重新加载这些数据。为此,我创建了一个具有保存/加载功能的新 java 类文件。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SLAPI {
public static void save(Object obj,String path) throws Exception
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(obj);
oos.flush();
oos.close();
}
public static Object load(String path) throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
Object result = ois.readObject();
ois.close();
return result;
}
}
我通常会收到“不可序列化”错误。使用 'implements Serializable' 和 ois.defaultReadObject() 或 oos.defaultWriteObject() 来检查文件上的序列号只会在对象为空时导致干净的保存/加载!当它包含数据时,我不断得到“java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException”
这显然是个问题!这里的建议之一:ArrayList custom class as HashMap key 未能产生任何更好的结果。事实上,创建自定义类是我开始的第一个问题 >.>
所以我想问题是:
1) 我必须改变什么才能使用自定义类作为键(并且正常工作)
2) 为什么它不能识别我将它设置为可序列化的类/函数/java 类
3) 为什么它适用于空的 hashmap,但不适用于填充的 hashmap?
【问题讨论】:
标签: java object hashmap serializable