Некоторое время я работал над проектом, и я столкнулся с несколькими сложностями и решениями, которые, похоже, не сработались.
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
Во-первых, мой hashmap - это hashmap, содержащий время, когда элемент был помещен (или добавлен) в мир. place это 'class place {}', содержащий строковый мир, double x, double y, double z; Проблема, с которой я столкнулся, заключается в том, что она не работает с хэш-картами. Я могу сохранить новый ключ хеша, используя его, но я не могу позвонить, чтобы получить его значение. Использование Location вместо этого решает эту проблему (hashmap) и работает без нареканий.
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: запись прервана; java.io.NotSerializableException»
Это явно проблема! Вот одна из рекомендаций: Пользовательский класс ArrayList с ключом HashMap не дал лучших результатов. На самом деле, создание собственного класса было моей первой проблемой для начала>.>
Так что я думаю, вопросы:
1) Что бы мне пришлось изменить, чтобы использовать пользовательский класс в качестве ключа (и работать правильно)
2) Почему он не распознает, что я устанавливаю его как сериализуемый класс / функцию / класс Java
3) Почему он работает с пустым hashmap, но не с заполненным hashmap?