在活动之间发送Serializable时发生StackOverflowError

时间:2019-03-15 14:16:58

标签: java android serialization stack-overflow

我有两个相似的对象,都来自同一类,它们非常相同。

我想将它们从一项活动传递给另一项活动。

它在大多数情况下都能正常运行,但是我从许多android 4.4设备上收到了崩溃报告,其中某个特定对象引发了StackOverflowError。

我已经在Android 4.4上进行了检查,并且我可以随时重复该错误。

我已经读到它可能是由两个问题引起的:

  • 对象太大
  • 对象中有递归链接

我已使用此func记录了两个可序列化的对象:

 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 KB

当我尝试使用带有序列化的Intent在活动之间传递堆栈时,会导致堆栈溢出:

03-15 13:59:18.492 6132-6132 / hu.adam.myapp.pack E / AndroidRuntime:致命异常:main

  

进程:hu.adam.myapp.pack,PID:6132       java.lang.StackOverflowError           在java.io.ObjectInputStream.checkReadPrimitiveTypes(ObjectInputStream.java:394)           在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:745)           在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)           在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)           在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)           在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)           在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)         在java.io.ObjectInputStream.readFieldValues(ObjectInputStre


一个更大的对象,没有任何问题或崩溃,它每次10/10都能工作

  

I / BYTE_SIZE:大对象,大小:188.49121 KB

所以我的问题:

如果它与大小无关-一定是与递归相关的错误-但是我怎么能准确地找到它呢?据我所知,我不使用任何圆形链接,该对象就像金字塔的层次结构,但是我当然可能是错的。

任何建议都应该从哪里开始搜索或应该怎么做?

谢谢。

0 个答案:

没有答案