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);