读回多个对象时流失的异常

时间:2011-06-04 22:37:35

标签: java serialization

我在文件中写了2个对象,但是当我尝试回读写入的对象时,它会在desrialize方法中抛出异常。它在我编写单个对象时工作正常,但在写入文件时有2个对象失败,并且在读取第二个对象时抛出了异常。

File_obj.Serialize_object(d, "/home/dasman/doc/serobj1.bin");
File_obj.Serialize_object(b, "/home/dasman/doc/serobj1.bin");
File_obj.deSerialize_object("/home/dasman/doc/serobj1.bin");



java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1373)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at Testpackage.File_obj.deSerialize_object(File_obj.java:242)
at File_test.main(File_test.java:28)

File_obj类中序列化和反序列化的方法在这里

public static void Serialize_object(Object obj,String filename){
    File a = new File(filename);
    ObjectOutputStream out = null;
    try{
     out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(a,true)));
    }catch(IOException e){
        e.printStackTrace();
    }
    try{

    out.writeObject(obj);
    out.close();
    }catch(IOException e){
        e.printStackTrace();
    }

}
    public static void deSerialize_object(String filename){
    File a = new File(filename);
    int objcount = 0;
    ObjectInputStream in = null;
    try{
     in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(a)));
    }catch(IOException e){
        e.printStackTrace();
    }
    Serializable_test obj1 = null;
    try{
    while(true){    

    obj1 = (Serializable_test) in.readObject();
    objcount++;
    System.out.println("The object area is :" + obj1.get_area());

    }
    }catch(EOFException e){
        System.out.println("END of object files reached objects read :" + objcount);
        //in.close();
    }catch(IOException e){
        e.printStackTrace();
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }


}

3 个答案:

答案 0 :(得分:1)

你的问题在这里?你正在将两个对象写入同一个文件 - 当然第二个将被附加到第一个 - java无法处理这个!

要修复,请:

  • A)写入不同的文件,或
  • B)将对象放在数组或Collection(例如List)中并将其写入一个文件并反序列化数组/ Collection并从那里检索对象

答案 1 :(得分:1)

反序列化例程一次只能重新构成一个对象(或对象图)。它假定读入的序列化内容仅属于单个对象,并将包含来自两个对象的数据的文件视为已损坏。

答案 2 :(得分:1)

您无法附加到通过ObjectOutputStream创建的文件。你必须重写整个文件。 ObjectOutputStream写入一个标头,如果ObjectInputStream在文件中重新出现,它将无法理解。

然而,您可以将多个对象写入相同的 ObjectOutputStream,并将其读回,与此处其他答案中所述相反。