У меня есть два похожих объекта, оба из одного и того же класса, они очень идентичны.
Я хотел бы передать их из одного вида деятельности в другой.
Большую часть времени он работает хорошо, но Я получил сообщения о сбоях от большого количества устройств Android 4.4 , что определенный объект выдает StackOverflowError.
Я проверил это на Android 4.4 и Я могу повторить ошибку в любое время.
Я прочитал, что это может быть вызвано двумя причинами:
- Объект слишком большой
- В объекте есть рекурсивное связывание
Я зарегистрировал два сериализуемых объекта с помощью этой функции:
public static String sizeof(Object obj) throws IOException {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
objectOutputStream.close();
return (byteOutputStream.toByteArray().length/1024.f) + " Kbytes";
}
У меня странный вывод, потому что более крупный объект работает нормально 10 \ 10 раз, а объект SMALLER каждый раз выдает StackOverflowError.
Проблемный объект с падением каждый раз:
I / BYTE_SIZE: проблемный объект, размер: 75,79004 Кбайт
Это вызывает переполнение стека, когда я пытаюсь передать его между активами, используя Intents с сериализацией:
03-15 13: 59: 18.492 6132-6132 / hu.adam.myapp.pack E / AndroidRuntime: ФАКТИЧЕСКОЕ ИСКЛЮЧЕНИЕ: main
Процесс: hu.adam.myapp.pack, PID: 6132 java.lang.StackOverflowError at java.io.ObjectInputStream.checkReadPrimitiveTypes (ObjectInputStream.java: ObjectInputStream.java: ObjectInputStream.java:394) в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:745) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1981) в java.io.ObjectInputStream.readObject (ObjectInputStream) jjio.ObjectInputStream.readFieldValues (ObjectInputStream.java:1115) в java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:455) в java.io.ObjectInputStream.readObjectForClass (ObjectInputStreamio.OjIn1)(ObjectInputStream.java:1244) в java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833) в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:762) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1981) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1938) в java.putStreamInFject.java: 1115) по адресу java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:455) по адресу java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1347) по адресу java.io.ObjectInputStream.read12put.jpg.jpgв java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833) в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:762) в java.io.ObjectInputStream.readObject (ObjectInputStio.ava.j::19:19) javaObjectInputStream.readObject (ObjectInputStream.java:1938) в java.io.ObjectInputStream.readFieldValues (ObjectInputStream.java:1115) в java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:45ream) в ObjectOput.jectOject.java: 1347) в java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1244) в java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833) в java.io.ObjectInputStream.readNonPrimitiveCon62.jpg: ObjectInjava.io.ObjectInputStream.readObject (ObjectInputStream.java:1981) в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1938) в java.io.ObjectInputStream.readFieldValues (ObjectInputStream.java:1115.bject.jject:io.bject.java:1115) в java.11.St..defaultReadObject (ObjectInputStream.java:455) в java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1347)в java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1244)
в java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833)
в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:762)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1981)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1938)
в java.util.HashMap.readObject (HashMap.java:1023)
в java.lang.reflect.Method.invokeNative (родной метод)
в java.lang.reflect.Method.invoke (Method.java:515)
в java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1332)
в java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1244)
в java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833)
в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:762)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1981)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1938)
в java.io.ObjectInputStream.readFieldValues (ObjectInputStream.java:1115)
в java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:455)
в java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1347)
в java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1244)
в java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:1833)
в java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:762)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1981)
в java.io.ObjectInputStream.readObject (ObjectInputStream.java:1938)
at java.io.ObjectInputStream.readFieldValues (ObjectInputStre
НАМНОГО больший объект без каких-либо проблем или сбоев, он работает каждый раз 10/10
I / BYTE_SIZE: Большой объект, размер: 188,49121 Кбайт
Итак, мои вопросы:
Если это не связано с размером - это должна быть ошибка, связанная с рекурсией - но как мне точно это выяснить? Насколько я знаю, я не использую никаких циклических связей, Объект похож на иерархию пирамид, но, конечно, я могу ошибаться.
Любой совет, с чего мне начать поиск или как это сделать?
Заранее спасибо.