как записать объект класса в bin-файл


Я использую java для отображения огромного графика. У меня есть объект персонализированного класса с этой картой, он состоит из нескольких карт hasmap и вызывает другие персонализированные классы, которые также состоят из объектов varios.

Моя проблема в том, что каждый раз, когда я запускаю это, чтобы выполнить тесты для сопоставления всего требуется около 5 минут, а затем для каждого узла может потребоваться от 1 до 10 минут для выполнения некоторых вычислений. И каждый раз, когда мне нужно исправить что-то в коде, мне приходится ждать.
Итак, мой вопрос(ы)

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

Как будет происходить синтаксический анализ?

Я начал изучать FileOutputStream/ObjectOutputStream и FileInputStream/ObjectInputStream, но я не уверен, что правильно понял, являются ли они хорошими вариантами для этой ситуации.

Буду очень признателен за любые комментарии и советы.

ОБНОВЛЕНИЕ: я прикрепляю код, который пытался использовать для сохранения объекта класса.

FileOutputStream fos = new FileOutputStream("tbox.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(tboxObject);
oos.flush();
oos.close();

Это для первого запуска, после этого я поменял код на:

FileInputStream fis = new FileInputStream("tbox.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
tboxObject savedTboxObject = (tboxObject) ois.readObject();

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


person keponk    schedule 30.06.2011    source источник
comment
хм, код выглядит нормально. сложно сказать в чем может быть проблема. вы проглатываете какие-либо исключения в блоке catch?   -  person aldrin    schedule 30.06.2011


Ответы (3)


Из документов по Java:

    FileOutputStream fos = new FileOutputStream("t.tmp");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(yourObject);
    oos.close();

Просто убедитесь, что все объекты в графе реализованы сериализуемыми.

person Abdullah Jibaly    schedule 30.06.2011
comment
привет, я пробовал этот способ. Я реализовал сериализуемость во всех объектах, присутствующих в классе MyObject, а затем пытаюсь прочитать его. FileInputStream fis = new FileInputStream("myFile.dat"); ObjectInputStream ois = new ObjectInputStream(fis); MyObject mo = (MyObject) ois.readObject(); Это вызывает исключение EOF. В качестве примечания: сохраненный файл был размером 1 КБ, я ожидал, что он будет размером не менее 4 или 5 МБ. Это много информации. - person keponk; 30.06.2011
comment
Должно быть что-то не так с вашим графом объектов, без кода трудно сказать. - person Abdullah Jibaly; 30.06.2011

Сериализация — это, вероятно, то, что вам нужно. Реализуйте сериализуемый интерфейс в своем классе, затем используйте ObjectOutputStream для записи объекта в файл.

person Kien Truong    schedule 30.06.2011

Да, вы можете сериализовать и сохранять объекты, используя классы OutputStream/InputStream. Однако будьте осторожны, когда вы изменяете класс (например, добавляете/удаляете/изменяете переменную экземпляра), а затем пытаетесь прочитать ранее сохраненный файл.

person aldrin    schedule 30.06.2011
comment
привет альдрин, файл будет прочитан только при первом запуске. после этого каждый раз, когда изменяется, я должен быть сохранен, поэтому программа останавливается и запускается снова, она имеет обновленную версию - person keponk; 30.06.2011
comment
в этом случае достаточно сохранить его в файл. опубликуйте свой код, если вы не можете заставить его работать. - person aldrin; 30.06.2011
comment
@joel_gil: Ваш код выглядит правильно. У вас есть какие-то проблемы с этим? - person Paŭlo Ebermann; 30.06.2011
comment
@paulo: проблема в том, что после первого запуска я получаю файл размером 1 КБ, тогда как я не ожидал ничего меньше мегабайт. И поэтому, когда я пытаюсь прочитать это, я получаю исключение EOF = S - person keponk; 01.07.2011
comment
@joel_gil: У вас есть try..catch вокруг вашего кода, который игнорирует исключения? Можете ли вы распечатать любое пойманное исключение? - person aldrin; 01.07.2011