2013-05-07 18 views
0

我有以下结构大的XML树:Simpleframework java.lang.StackOverflowError的树反序列化

<?xml version="1.0"?> 
<SampleElem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Children> 
     <SampleElem> 
     <Children/> 
     <Id>1</Id> 
     <Value>Test2</Value> 
     </SampleElem> 
    </Children> 
    <Id>-1</Id> 
    <Value>Test1</Value> 
</SampleElem> 

我试图用simpleframework到反序列化:

Serializer serializer = new Persister(); 
SampleElem root = serializer.read(SampleElem.class, someStream, false); 

一段时间后停止的应用与错误。从设备登录:

E/AndroidRuntime(13591): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(13591): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(13591): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(13591): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
E/AndroidRuntime(13591): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
E/AndroidRuntime(13591): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
E/AndroidRuntime(13591): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
E/AndroidRuntime(13591): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
E/AndroidRuntime(13591): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
E/AndroidRuntime(13591): at java.lang.Thread.run(Thread.java:1019) 
E/AndroidRuntime(13591): Caused by: java.lang.StackOverflowError 
E/AndroidRuntime(13591): at java.lang.StringBuilder.append(StringBuilder.java:217) 
E/AndroidRuntime(13591): at java.lang.reflect.Modifier.toString(Modifier.java:285) 
E/AndroidRuntime(13591): at java.lang.reflect.Method.toString(Method.java:538) 
E/AndroidRuntime(13591): at java.lang.reflect.Method.equals(Method.java:361) 
E/AndroidRuntime(13591): at org.apache.harmony.lang.annotation.AnnotationFactory.invoke(AnnotationFactory.java:307) 
E/AndroidRuntime(13591): at $Proxy1.inline(Native Method) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.ElementListLabel.getConverter(ElementListLabel.java:160) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CacheLabel.getConverter(CacheLabel.java:280) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readVariable(Composite.java:604) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.populate(CompositeList.java:175) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.read(CompositeList.java:120) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.populate(CompositeList.java:175) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.read(CompositeList.java:120) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readUnion(Composite.java:549) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElement(Composite.java:532) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readElements(Composite.java:445) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.access$400(Composite.java:59) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1383) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:201) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.read(Composite.java:148) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.populate(CompositeList.java:175) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.CompositeList.read(CompositeList.java:120) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readVariable(Composite.java:623) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Composite.readInstance(Composite.java:573) 
E/AndroidRuntime(13591): at org.simpleframework.xml.core.Compos 

数据是完全正确的,输入xml是完全有效的。你有什么想法?

谢谢!

UPDATE:

什么TreeStrategy?它应该如何使用?你有没有例子?

+0

可能是内存问题,因为树太大?你是否尝试过较小的? – Evans 2013-05-07 21:45:45

+0

是的,树的分层长度很大,但我无法分割它。我需要处理整棵树。较小的树木很好。 – asolovyov 2013-05-07 21:54:20

+0

然后尝试使用-Xss增加JVM的堆栈大小。检查这个链接中的问题和答案http://stackoverflow.com/questions/3700459/how-to-increase-to-java-stack-size – Evans 2013-05-07 22:00:28

回答

0

在我的情况最令人满意的解决方案是重写我的XML模式线性结构。它减少了对反序列化树的总内存要求。

感谢所有的评论。

0

尝试增加存储器,包括这些参数:

-Xmx1024m -Xss1024m 

您可以指定的内存量奉献。

+0

我无法使用它,我正在使用android。另外,可以放大xml的大小。 – asolovyov 2013-05-07 22:10:22

0

通过将以下JVM参数更改堆栈大小:

-Xss128m 

因为,你的XML文件很大,解析器似乎是在做一个递归(可能是因为<SampleElem>可以<SampleElem>作为一个孩子)堆栈大小需要增加。默认大小仅为512 KB。

注意:如果解析仍然失败,则为128m;保持加倍的大小(如256米,然后512米等)

+0

它不能在Android上使用。 – asolovyov 2013-05-07 22:12:48

+1

啊,我跳了枪!无论如何,一般来说,如果解析带有内存约束的XML,应该使用SAX解析器(基于事件),而不是尝试在内存中表示完整XML输入的DOM。 – 2013-05-07 22:23:00

+0

您是否知道任何适用的库,用于通过SAX从xml自动反序列化为对象? – asolovyov 2013-05-07 22:33:03

1

您不能在Android上更改默认堆栈大小或现有线程的堆栈大小。但是,您可以在创建线程时设置堆栈大小。使用完整的构造函数:

public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) 

您可以将堆栈大小设置为256KB。

因此,您的情况下的策略是创建一个深层堆栈的新线程,并在该线程上运行此分析代码。