Java: загрузитесь объект экономил на жестком диске после рефакторинга => “класс, не найденный” исключение:/

Я разрабатываю приложение в 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;
}

Кто-либо может помочь мне с этим?Большое спасибо.

5
задан Seb_Lz 12 May 2010 в 11:12
поделиться

2 ответа

Изменение имени класса (включая изменение имени пакета) - это гарантированный способ сломать механизм сериализации; он просто не предназначен для работы с классами, которые меняют имена.

Практически единственное, что вы можете сделать, это отменить рефакторинг, чтобы получить первоначально названный класс, затем получить текущую версию в той же рабочей области, использовать исходный класс для десериализации, программно скопировать его содержимое в экземпляр подвергнутого рефакторингу class, а затем сериализуйте это.

Если вы хотите избежать подобных неприятностей, подумайте об использовании более надежного и гибкого метода сериализации, такого как XStream .

7
ответ дан 14 December 2019 в 01:03
поделиться

Ваш пример демонстрирует, почему сериализация не подходит для долгосрочного хранения данных: у вас нет (реального) контроля над форматом файла, а сериализованные файлы очень тесно связаны с вашим исходным кодом - если вы измените исходный код, вы больше не сможете прочитать ранее сериализованные файлы.

Приложения, в которых сериализация полезна, - это использование RMI для передачи объектов через сетевое соединение или для краткосрочного временного хранения данных (например, для кэша на диске).

Для долгосрочного хранения данных используйте что-нибудь другое, например, XML, как предлагает Майкл, или какой-нибудь другой (стандартный) формат файлов.

2
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: