StackOverflowError при отправке сериализуемых таблиц между действиями - PullRequest
2 голосов
/ 15 марта 2019

У меня есть два похожих объекта, оба из одного и того же класса, они очень идентичны.

Я хотел бы передать их из одного вида деятельности в другой.

Большую часть времени он работает хорошо, но Я получил сообщения о сбоях от большого количества устройств 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 Кбайт

Итак, мои вопросы:

Если это не связано с размером - это должна быть ошибка, связанная с рекурсией - но как мне точно это выяснить? Насколько я знаю, я не использую никаких циклических связей, Объект похож на иерархию пирамид, но, конечно, я могу ошибаться.

Любой совет, с чего мне начать поиск или как это сделать?

Заранее спасибо.

...