Java: сериализация и десериализация ArrayList - PullRequest
0 голосов
/ 12 октября 2018

У меня есть класс Book(), Author() и класс CollectionOfBooks() (где я храню все книги в ArrayList).Тогда у меня есть мой интерфейс, где у меня есть меню, где я могу добавить / список / удалить / поиск книг.Все отлично работаетНо я также хочу сохранить свои книги в файле при выходе из программы, поэтому, когда программа заканчивается, я вызываю этот метод (BooksIO() - это класс для сериализации и десериализации):

public void exitProgram() throws IOException{
        System.out.println("Program shuts down, cya!");
        BooksIO.outputFile(); // to save my books to the file
    }

Я не уверенесли книги сохранены, потому что, когда я запускаю программу, книги не отображаются:

public static void main(String[] args) throws IOException, ClassNotFoundException {
        UserInterface menu = new UserInterface();
        BooksIO.inputFile(); // get the books from the saved file to the library
        menu.run();
    }

Я не уверен, что делаю неправильно, кто-то может мне помочь?Класс для Serialize & DeSerialize:

    public class BooksIO {

            public static  void outputFile() throws IOException{
                CollectionOfBooks library = new CollectionOfBooks(); //where the books are saved in an ArrayList
                FileOutputStream fout=null;
                ObjectOutputStream oos=null;
                try{
                    fout = new FileOutputStream ("stefi.ser");
                    oos=new ObjectOutputStream(fout);
                    // I try to save my library to the file
                    oos.writeObject(library.Books); 

                    System.out.println("Serializing successfully completed");

                    for(Book c: library.Books){
                        System.out.println(c.toString());
                    }
                } catch (IOException ex){
                    System.out.println(ex);
                }finally{
                    try{
                        if(fout!=null) fout.close();
                        if(oos!=null) oos.close();
                    } catch (IOException e){

                    }
                }
            }

            public static void inputFile() throws IOException, ClassNotFoundException{

                CollectionOfBooks library = new//where my books are saved in an ArrayList of type Book CollectionOfBooks();//where my books are saved in an ArrayList of type Book
                ObjectInputStream ois = null;
                try{
                    FileInputStream fin = new FileInputStream("stefi.ser");
                    ois = new ObjectInputStream(fin);
                    // try to get my books from the file and save it in the library
                    library.Books  = (ArrayList<Book>)ois.readObject();
                    System.out.println("Deserializing successfully completed");

                    for(Book c: library.Books){
                        System.out.println(c.toString());
                    }

                }catch (ClassNotFoundException e){
                    System.out.println("The class for this type of objects"+
                            "does not exist in this application!");
                    throw e;
                }finally{
                    try{
                        if(ois!=null){
                            ois.close();
                        }
                    }catch (IOException e){

                    }
                }
            }
        }

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

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

Дайте классу UserInterface метод public void updateBooks(CollectionOfBooks books) и вызовите его с обновленной коллекцией книг:

public void updateBooks(CollectionOfBooks collectionOfBooks) {
    this.collectionOfBooks = collectionOfBooks;
}

Измените inputFile, чтобы он возвращал объект CollectionOfBooks:

public static CollectionOfBooks inputFile() throws IOException, ClassNotFoundException{
    //...

}

и затем верните коллекцию.

Тогда в основном вы можете сделать:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    UserInterface menu = new UserInterface();
    menu.updateBooks(BooksIO.inputFile()); 
    menu.run();
}
0 голосов
/ 12 октября 2018

Прямо в верхней части метода outputFile () вы инициализируете переменную "library" для новой (предположительно пустой) CollectionOfBooks, а затем сериализуете ее.

Вместо этого вы хотите передатьэкземпляр приложения CollectionOfBooks в метод outputFile () и его сериализацию.

Кроме того, хотя другие могут не согласиться, я считаю сериализацию Java немного неуклюжей, и у нее есть некоторые странные крайние случаи, которые вам необходимобыть осведомленным.Лично я бы не использовал его, если бы мне не пришлось по какой-то причине - я бы использовал библиотеку сериализации JSON, например, GSon.

...