反序列化文件并返回包含文件中对象的arraylist

时间:2014-02-03 05:32:08

标签: java deserialization

我已经将一个arraylist序列化到一个文件中,但很难将它们反序列化为一个arraylist并打印出来。如何编辑我的代码?谢谢!

这是序列化方法:

    public static void writeMembersToDisk(ArrayList<Member> membersList) {
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("members.s")));

        for(Member cmd : membersList) {
            out.writeObject(cmd);
        }
    } catch (Exception e) {
        System.err.println("Error: " + e.toString());
    } finally {
        try {
            out.close();
        } catch (IOException e) {
            System.err.println("Error: " + e.toString());
        }
    }
}

我不知道如何将文件反序列化回arraylist,这是我的代码:

    public static ArrayList<Member> readMembersFromDisk() {

        ArrayList<Member> cmd = null;

        try {
            FileInputStream is = new FileInputStream("members.s");

            ObjectInputStream os = new ObjectInputStream(is);                           

            cmd = (ArrayList) os.readObject();

            os.close();  

        } catch (Exception e) {
            System.err.println("Error: " + e.toString());            
        }

        return cmd;

}

当我尝试打印arraylist时,我收到一个错误:“java.lang.ClassCastException:Member无法强制转换为java.util.ArrayList”

    public static void main(String[] args) {
    ArrayList<Member> list = MembersListFileManager.readMembersFromDisk();      
            System.out.println(list);
}

1 个答案:

答案 0 :(得分:2)

您正在从原始列表中一次编写一个Member对象。

for(Member cmd : membersList) {
    out.writeObject(cmd);
}

但在阅读时,您正试图将Member对象转换为ArrayList这是错误的。

您需要通过执行以下操作将读取对象强制转换为Member

Member member = (Member) os.readObject();

但这只是获取序列化的第一个对象。要获取所有对象,请遍历并继续将每个成员对象添加到arraylist中。

// Pseudo-code
loop till objects are there{
    Member member = (Member) os.readObject(); // read the object
    cmd.add(member); // add it to the list
}

循环使用它的方法之一是,

while (true) {
    try {
        Member member = (Member) os.readObject();
        // Do something with the object
    } catch (EOFException e) {
        break; // Break when the end-of-file is reached
    }
}
os.close();