我有一个问题,当我试图反序列化一个数组列表,. 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
您的问题在这一行:
oos.writeObject(listaPessoas.add(p1));
Java Collections API不流畅。add
方法不返回List,而是返回一个指示操作是否成功的boolean
。所以你应该像这样把上面的行分成两行:
listaPessoas.add(p1);
oos.writeObject(listaPessoas);
您的问题在序列化:
oos.writeObject(listaPessoas.add(p1));
写入List.add()
的返回值,该值是一个布尔值(如果操作改变了集合,则为true),然后将其装箱到Boolean
中。
当你反序列化时:
listaPessoas = (ArrayList<Pessoa>) ois.readObject();
在流中找到一个布尔值,但您试图将其强制转换为List,从而生成类强制转换异常。
只需在单个语句中保持列表的序列化,如:
listaPessoas.add(value);
[...] // other operation on the list
oos.writeObject(listaPessoas);
将ArrayList
写入ObjectOutputStream
,而不是add
方法的返回值
listaPessoas.add(p1)
oos.writeObject(listaPessoas);
您正在序列化布尔变量oos.writeObject (listaPessoas.add (p1));——add()返回值为布尔值
你应该这样做。listaPessoas.add (p1);oos.writeObject (arraylistobject);