我正在将一个对象的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。
答案 0 :(得分:0)
如果没有特殊技巧来抑制由ObjectOutputStream的构造函数写入的第二个流标头,则无法附加到对象流文件。你的ObjectInputStream遇到了它所期望的对象和barfing。