从序列化文件中读取数据会抛出java.io.StreamCorruptedException:

时间:2014-01-23 09:34:27

标签: java file serialization

我正在将一个对象的arraylist转储到一个文件中。我按对象序列化并登录到文件而不是整个arraylist序列化,因为没有。 arraylist可以是一个。该过程工作正常,数据附加在文件中,但在反序列化期间,我只能检索第一个arraylist对象,一旦第二个arraylist对象出现,它就会抛出 java.io.StreamCorruptedException:无效的类型代码:AC 。我的每个arraylist都有相同类型的对象。我试图搜索很多,但没有像重置,AppendableObjectoutputstream这样的技巧。

我的序列化代码是:

 public static void dumplogInFile(ArrayList<HtmlElementObject> sanitizelog)
{
    try
      {
         String fileName = "c:\\temp\\ auditinfo.ser";
         FileOutputStream fileOut =
         new FileOutputStream(fileName , true);
         ObjectOutputStream  out = new ObjectOutputStream(fileOut);
         for(HtmlElementObject eachobj : sanitizelog)
         {
             out.writeObject(eachobj);
             out.reset() ;
         }
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/auditinfo.ser");
         //logElementData.clear();
      }catch(IOException i)
      {
          i.printStackTrace();
      }

}

这里arraylist的数量将更多而不是一个,因为如果webservice失败那么它会将数据转储到文件中。

我的反序列化代码,用于从文件

读取数据
 public static ArrayList<HtmlElementObject> extractLogFromFile()
    {

        HtmlElementObject v ;
        ArrayList<HtmlElementObject> extractLogList = new ArrayList<HtmlElementObject>();


        try
          {
             FileInputStream fileIn = new FileInputStream("c:\\temp\\ auditinfo.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
          //   ObjectInputStream in = new ObjectInputStream(fileIn);
           /*  ArrayList<HtmlElementObject> arr = (ArrayList<HtmlElementObject>) in.readObject();

           //  for (HtmlElementObject a : arr) 
             //   {
                 //a = (HtmlElementObject) in.readObject();
                 //extractLogList.add(a);

                //}*/

             int count =0;
             while( (v = (HtmlElementObject)in.readObject()) != null)
             {
                 System.out.println(count++);

                 HtmlElementObject a;
                 a = v;//(HtmlElementObject) in.readObject();
                 extractLogList.add(a);


             }


           in.close(); 
           fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return extractLogList ;
          }catch(ClassNotFoundException c)
          {
             System.out.println(" class not found");
             c.printStackTrace();
             return null ;
          }
        return extractLogList;
    }

}

现在这个函数将很容易读取第一个arraylist的所有对象,但是当新的arraylist对象出现时,它会抛出java.io.StreamCorruptedException。

1 个答案:

答案 0 :(得分:0)

如果没有特殊技巧来抑制由ObjectOutputStream的构造函数写入的第二个流标头,则无法附加到对象流文件。你的ObjectInputStream遇到了它所期望的对象和barfing。