Java десериализация и ArrayList странное исключение

У меня возникла проблема, когда я пытаюсь десериализовать ArrayList, метод.readObject() возвращает логическое значение вместо объекта, и я понятия не имею, почему это происходит. Спасибо и извините за плохой английский.

Класс для сериализации

import java.io.Serializable;

public class Pessoa implements Serializable {

public String nome;
public String sobrenome;
public int idade;

public Pessoa(String n, String sn, int i){
    this.nome = n;
    this.sobrenome = sn;
    this.idade = i;
}
}

Сериализация и десериализация

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TESTES {

public static void main(String[] args) {

    Pessoa p1 = new Pessoa("Tony", "Stark", 35);
    ArrayList<Pessoa> listaPessoas = new ArrayList<>();

    try {
        FileOutputStream fos = new FileOutputStream("obj.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(listaPessoas.add(p1));
        oos.flush();
        oos.close();

    } catch (FileNotFoundException ex) {
        Logger.getLogger(TESTES.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(TESTES.class.getName()).log(Level.SEVERE, null, ex);
    }


    try {
        FileInputStream fis = new FileInputStream("obj.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);

        //===== HERES THE PROBLEM =========================
        listaPessoas = (ArrayList<Pessoa>) ois.readObject();
        //===== HERES THE PROBLEM =========================

        ois.close();

        System.out.println(listaPessoas.get(0).nome);

    } catch (FileNotFoundException ex) {
        Logger.getLogger(TESTES.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(TESTES.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

Исключение

Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be          cast to java.util.ArrayList
at testes.TESTES.main(TESTES.java:41)
Java Result: 1

4 ответа

Решение

Ваша проблема в сериализации:

oos.writeObject(listaPessoas.add(p1));

это записывает возвращаемое значение List.add() который является логическим (истина, если коллекция изменяется операцией), который затем помещается в Boolean,

Когда вы затем десериализуете:

 listaPessoas = (ArrayList<Pessoa>) ois.readObject();

логическое значение найдено в потоке, но вы пытаетесь привести его к List, генерируя исключение приведения класса.

Просто держите сериализацию списка в одном выражении, например:

 listaPessoas.add(value);
 [...] // other operation on the list
 oos.writeObject(listaPessoas);

Ваша проблема в этой строке:

oos.writeObject(listaPessoas.add(p1));

API коллекций Java не свободно. add Метод не возвращает список, но вместо boolean указывает, была ли операция успешной. Таким образом, вы должны разбить строку выше на две, как это:

listaPessoas.add(p1);
oos.writeObject(listaPessoas);

Вы сериализуете логическую переменную oos.writeObject(listaPessoas.add(p1)); - add() возвращаемое значение логическое.

Вы должны сделать это так. listaPessoas.add(р1); oos.writeObject(arraylistobject);

Написать ArrayList к ObjectOutputStream а не возвращаемое значение add метод.

 listaPessoas.add(p1)
 oos.writeObject(listaPessoas);
Другие вопросы по тегам