簡體   English   中英

Java反序列化和ArrayList怪異異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM