在序列化我的对象是一个自定义类,持有各种ArrayLists,我经常得到一个Concurrent Mod Exception。显然,一个或多个arraylists正在抛出这个。但我不知道在哪里或如何解决它。实现迭代器将是我的第一个想法,但如何进行序列化呢?
这是我的序列化代码:enter code here
try{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(TGame);
// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/game_folder");
dir.mkdirs();
File file = new File(dir, "serializationtest");
FileOutputStream fos = new FileOutputStream(file);
//this.openFileOutput(filename, Context.MODE_PRIVATE);
fos.write(buf);
fos.close();
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
}catch(StackOverflowError e){
//do something
}
File f =this.getDir(filename, 0);
Log.v("FILE SAVED",f.getName());
}catch(ConcurrentModificationException e){
//do something
}
}
答案 0 :(得分:0)
当Java api序列化对象(这里是内部数组列表)时,如果同时某个其他线程在结构上修改了ArrayList,那么你会得到一个并发Mod异常。
一种解决方案是锁定机制,确保一次只有一个线程访问该对象。 另一个简单的解决方案是要写入的对象,创建该对象的浅表副本并序列化该副本。这种方式即使原始ArrayList发生变化,浅拷贝也不起作用,并且可以正常工作。 e.g。
class Test {
int a;
string b;
ArrayList<String> c;
Test(Test t){
this.a=t.a;
this.b=t.b;
this.c=new ArrayList<String>(t.c);
}
}
FileOutputStream fos = new FileOutputStream(file);
//write a copy of original object
fos.write(new Test(t));
}