Я разрабатываю приложение в Java, что regulary сохраняет объекты на жесткий диск с помощью этого простого метода:
public void save(String filename)
{
try
{
FileOutputStream fos = new FileOutputStream(filename);
GZIPOutputStream gzos = new GZIPOutputStream(fos);
ObjectOutputStream out = new ObjectOutputStream(gzos);
out.writeObject(this);
out.flush();
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
Объект является экземпляром sebbot.learning. Класс DirectPolicySearch.
Проблема, после некоторого рефакторинга пакет изучения был переименован к 'ballcapture'. Теперь, когда я пытаюсь загрузить сохраненный файл, я получаю следующее исключение:
java.lang. ClassNotFoundException: sebbot.learning. DirectPolicySearch
Метод, который я использую для загрузки файла:
public static synchronized DirectPolicySearch load(String filename)
{
DirectPolicySearch dps = null;
try
{
FileInputStream fis = new FileInputStream(filename);
GZIPInputStream gzis = new GZIPInputStream(fis);
ObjectInputStream in = new ObjectInputStream(gzis);
dps = (DirectPolicySearch) in.readObject();
in.close();
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(dps);
return dps;
}
Кто-либо может помочь мне с этим?Большое спасибо.
Изменение имени класса (включая изменение имени пакета) - это гарантированный способ сломать механизм сериализации; он просто не предназначен для работы с классами, которые меняют имена.
Практически единственное, что вы можете сделать, это отменить рефакторинг, чтобы получить первоначально названный класс, затем получить текущую версию в той же рабочей области, использовать исходный класс для десериализации, программно скопировать его содержимое в экземпляр подвергнутого рефакторингу class, а затем сериализуйте это.
Если вы хотите избежать подобных неприятностей, подумайте об использовании более надежного и гибкого метода сериализации, такого как XStream .
Ваш пример демонстрирует, почему сериализация не подходит для долгосрочного хранения данных: у вас нет (реального) контроля над форматом файла, а сериализованные файлы очень тесно связаны с вашим исходным кодом - если вы измените исходный код, вы больше не сможете прочитать ранее сериализованные файлы.
Приложения, в которых сериализация полезна, - это использование RMI для передачи объектов через сетевое соединение или для краткосрочного временного хранения данных (например, для кэша на диске).
Для долгосрочного хранения данных используйте что-нибудь другое, например, XML, как предлагает Майкл, или какой-нибудь другой (стандартный) формат файлов.