![](/img/trans.png)
[英]JSON deserialization throwing exception - Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
[英]Java Deserialization and ArrayList weird Exception
我在嘗試反序列化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
您的問題在這一行:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.