Сериализация Java ArrayList с помощью метода writeObject объекта ObjectOutputStream не будет работать - PullRequest
0 голосов
/ 02 октября 2018

У меня есть метод класса «команда», который должен сохранить ArrayList в файл, но он сохраняет мусор.Метод принимает ArrayList, содержащий объекты класса (Beer), который реализует Serializable (имеющий только ключевые слова «Implements Serializable» после имени класса без реализаций метода).Это выглядит так:

public class Save implements Command {
    public void execute(ArrayList<Beer> beers, String cmd []) {
    if(cmd[0].equals("save")) {


        File file = new File(cmd[1]);
        try
        {
           FileOutputStream fileOut = new FileOutputStream(file);
           ObjectOutputStream out = new ObjectOutputStream(fileOut);
           out.writeObject(beers);
           out.close();
        }
        catch(IOException i)
        {
            i.printStackTrace();
        }

    }
}
}

для списка, содержащего пиво со следующими атрибутами:

[beername] [type] [strength]

heineken idk 5.3

pilsner idk 4.2

это то, что находится в файле:

¬í sr java.utiМетод тоже в том же стиле, и он не читает мусор выше в ArrayList.

public class Load implements Command {
@SuppressWarnings("unchecked")
public void execute(ArrayList<Beer> beers, String cmd[]) {
    if(cmd[0].equals("load")) {
        File file = new File(cmd[1]);
        try {
            FileInputStream fin= new FileInputStream (file);
            ObjectInputStream ois = new ObjectInputStream(fin);
            beers = (ArrayList<Beer>)ois.readObject();
            fin.close();
        }
        catch(IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
}

Как мне изменить этот код, чтобы он сохранял только атрибуты в текстовый файл и загружал их обратно правильно?Я хотел бы придерживаться метода ObjectOutputStream readObject и writeObject.Спасибо

Ответы [ 2 ]

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

Полагаю, ваша проблема скорее в дизайне вашего метода Load.execute, чем в самом процессе чтения / записи, поскольку последний работает.Но с вашим текущим дизайном загруженные данные теряются.Вы должны изменить свой метод Load.execute следующим образом.

Либо измените сигнатуру вашего метода, объявите параметр List внутри вашего метода, заполните его, как вы уже сделали, и верните его:

public class Load implements Command {
    @SuppressWarnings("unchecked")
    public List<Beer> execute(String cmd[]) {
        List<Beer> beers = null;
        if(cmd[0].equals("load")) {
            ...
        }
        return beers;
    }
}

или заполните переданный список, используя метод addAll вместо присвоения (поскольку последний не заполняет переданный список):

public class Load implements Command {
    @SuppressWarnings("unchecked")
    public void execute(ArrayList<Beer> beers, String cmd[]) {
        ...
        beers.addAll((ArrayList<Beer>) ois.readObject());
        ...
    }
}
0 голосов
/ 02 октября 2018

Вместо того, чтобы передавать объект ArrayList в качестве параметра для загрузки метода, вы должны создать новый массив в методе загрузки, прочитать сериализованный файл в список и вернуть его в конце метода.

 public ArrayList<Beer> execute( String cmd[]) {
    ...

    return ((ArrayList<Beer>) ois.readObject());
}
...