Как десериализовать объекты после закрытия открывающей программы в Java 11 - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть программа, в которой я пытаюсь реализовать сохранение и загрузку объектов, однако я не могу заставить загрузку работать после закрытия программы, поэтому эффективно только сохранение и загрузка работают, пока программа открыта, но нетданные всегда загружаются после запуска программы.Я предполагаю, что это как-то связано с обертыванием.Я создал тестовую программу, чтобы посмотреть, смогу ли я заставить ее работать, просто используя простой класс Person.Я храню свои объекты Peson в ArrayList и сериализую его, а затем десериализую.В настоящее время я храню все загруженные объекты Person в JComboBox.Я посмотрел онлайн и не смог найти ничего, что поможет.Также обратите внимание, что я знаю, что использование сериализации не лучший способ сохранения объектов, но это то, что подходит для моей программы.

Класс моего приложения:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;

public class App  extends JFrame {
    public static JComboBox<Person> peopleBox;
    public App(){
        try {
            Person.peopleList = loadList();
        }
        catch(IOException | ClassNotFoundException e){
            System.out.println(e.getMessage());
        }
        try {
            saveList(Person.peopleList);
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
        peopleBox = new JComboBox<>();
        peopleBox.setModel(getComboBoxModel(Person.peopleList));
        add(peopleBox);
        pack();
        setSize(600, 400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

    public DefaultComboBoxModel<Person> getComboBoxModel(ArrayList<Person> peopleList){
        Person[] comboBoxModel = peopleList.toArray(new Person[0]);
        return new DefaultComboBoxModel<>(comboBoxModel);
    }
    public static void saveList(ArrayList<Person> peopleList) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.bin"));
        objectOutputStream.writeObject(peopleList);
    }
    public static ArrayList<Person> loadList() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.bin"));
        Person.peopleList = (ArrayList<Person>) objectInputStream.readObject();
        return  Person.peopleList;
    }

    public static void main(String[] args){
       // Person p  = new Person("Sean", 22);
        try {
            saveList(Person.peopleList);
        }catch (IOException e){
            System.out.println(e.getMessage());
        }
        App app = new App();
        app.pack();
        app.setVisible(true);
    }

}

Класс пользователя

import java.io.Serializable;
import java.util.ArrayList;

public class Person implements Serializable {

    public int age;
    public String name;
    public static ArrayList<Person> peopleList = new ArrayList<>();

    public Person(String name, int age){
        this.age = age;
        this.name = name;
        peopleList.add(this);
        for(Person p : peopleList){
            System.out.println(p.toString());
        }
    }

    public Person(){
    }

    public String toString(){
        return "Name : " + name + " Age: " + age;
    }
}

Я ожидаю, когда сохраню список вфайл «test.bin», закройте программу, затем снова откройте ее, чтобы загрузить список и отобразить объекты, которые я создал до того, как я закрыл программу.Я ценю любую помощь, спасибо.

1 Ответ

0 голосов
/ 10 февраля 2019

Вы сохраняете пустой список перед загрузкой Person из файла.Я предлагаю такой подход:

import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class App extends JFrame {

    public static JComboBox<Person> peopleBox;

    public App() {
        try {
            loadList();
        } catch (IOException | ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
        try {
            saveList(Person.peopleList);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        setSize(600, 400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public void updateData(){
        peopleBox = new JComboBox<>();
        peopleBox.setModel(getComboBoxModel(Person.peopleList));
        add(peopleBox);
        pack();
    }

    public DefaultComboBoxModel<Person> getComboBoxModel(ArrayList<Person> peopleList) {
        Person[] comboBoxModel = peopleList.toArray(new Person[0]);
        return new DefaultComboBoxModel<>(comboBoxModel);
    }

    public static void saveList(ArrayList<Person> peopleList) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.bin"));
        objectOutputStream.writeObject(peopleList);
    }

    public static void loadList() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.bin"));
        Person.peopleList.addAll((List<Person>) objectInputStream.readObject());
    }

    public static void main(String[] args) {
        App app = new App();
        Person p = new Person("Sean2", 24);
        try {
            saveList(Person.peopleList);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        app.updateData();
        app.setVisible(true);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...