2011-06-04 47 views
1

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

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(); 
    } 


} 
+0

尽管在覆盖写入错误,波希米亚提供了一些关于如何解决这个问题的好建议。如果这些建议不适合你,我建议你发布[SSCCE](http://pscode.org/sscce.html)。 – 2011-06-04 22:49:00

回答

1

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

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

1

这里有什么你的问题?你正在写两个对象到同一个文件中 - 当然第二个将被追加到第一个 - java不能处理这个!

要修复,或者:

  • A)写入不同的文件,或
  • B)把对象以阵列或)系列(例如列表和写入到一个文件和反序列化array/Collection并从那里检索您的对象
+0

但是,如果你注意到我有FileOutputStream(a,true)),所以它应该附加到文件的权利? – dasman 2011-06-04 22:45:00

+2

“你正在将两个对象写入同一个文件 - 当然第二个会覆盖第一个。” Nu-uh - 当'FileOutputStream(a,true)'..设置为追加时不行。 – 2011-06-04 22:46:55

+0

它不会改变我的建议的有效性!为什么-1? – Bohemian 2011-06-05 01:59:17

1

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

+0

嗯所以如果我一次写入一个对象数组而没有关闭通道呢?它能重建所有的物体吗? – dasman 2011-06-04 22:51:53

+0

是的。整个对象图将被序列化。这是波希米亚人的'B'建议。 – btreat 2011-06-04 23:01:02

+0

-1。完全不正确。只要你喜欢,你可以写出尽可能多的对象。但是你必须使用相同的ObjectOutputStream来编写它们。看到我的答案。 – EJP 2011-06-05 01:36:03