【问题标题】:Serializing and deserializing Java generics using Jackson: StackOverflowError使用 Jackson 序列化和反序列化 Java 泛型:StackOverflowError
【发布时间】:2012-08-07 16:14:10
【问题描述】:

我目前正在研究一个使用泛型且不太复杂的模型。我知道已经回答了类似的问题,但没有一个明确回答我的问题。

这是我的模型:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type")
@JsonSubTypes(
              { 
                  @Type(value = Cls2.class, name = "Cls2") 
              })
abstract class Cls1<T> implements Serializable
{
    private T myObj;

    public T getMyObj()
    {
        return myObj;
    }

    public Cls1(T obj)
    {
        myObj = obj;
    }
    @JsonTypeName("Cls2")
    public static class Cls2<E extends Int1> extends Cls1<E> implements Serializable
    {
        public Cls2()
        {
            super(null);
        }
    }
}

@JsonTypeName("ChildContainer")
class ChildContainer extends ParentContainer<OtherBean>
{

}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type")
@JsonSubTypes(
              { 
                  @Type(value = ChildContainer.class, name = "ChildContainer") 
              })
class ParentContainer<T extends RootBean> implements Int1
{

}

@JsonTypeName("OtherBean")
class OtherBean extends RootBean
{

}

@JsonTypeName("RootBean")
class RootBean implements Int1
{

}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT, property = "type")
@JsonSubTypes(
              { 
                  @Type(value = RootBean.class, name = "RootBean"),
                  @Type(value = OtherBean.class, name = "OtherBean")
              })
interface Int1 extends Serializable
{

}

我的目标是使用 jackson 进行序列化和反序列化,如下所示:

public static void main(String[] args) throws Exception
    {

        Cls2<ChildContainer> req = new Cls2<ChildContainer>();

        File file = new File("==some-file-path==");

        ObjectMapper mapper = new ObjectMapper();

        mapper.writeValue(file, req);

        //read it back using mapper.readValue(file, clazz) --Not sure about this
    }

我在序列化过程中收到以下 java.lang.StackOverflowError:

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.Class.getDeclaringClass(Native Method)
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290)
    at org.codehaus.jackson.map.type.TypeBindings._resolve(TypeBindings.java:221)
    at org.codehaus.jackson.map.type.TypeBindings.findType(TypeBindings.java:138)
    at org.codehaus.jackson.map.type.TypeFactory._fromVariable(TypeFactory.java:951)
    at org.codehaus.jackson.map.type.TypeFactory._constructType(TypeFactory.java:493)
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:423)
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:395)
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:299)
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290)
    at org.codehaus.jackson.map.type.TypeBindings._resolve(TypeBindings.java:221)
    at org.codehaus.jackson.map.type.TypeBindings.findType(TypeBindings.java:138)
    at org.codehaus.jackson.map.type.TypeFactory._fromVariable(TypeFactory.java:951)
    at org.codehaus.jackson.map.type.TypeFactory._constructType(TypeFactory.java:493)
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:423)
    at org.codehaus.jackson.map.type.TypeFactory.findTypeParameters(TypeFactory.java:395)
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:299)
    at org.codehaus.jackson.map.type.TypeBindings._resolveBindings(TypeBindings.java:290)

非常感谢任何帮助。

【问题讨论】:

  • 从错误消息中或在调试器中捕获堆栈的(重复)部分,肯定有助于确定循环发生的位置。
  • @AndrzejDoyle 我已经用 stacktrace 更新了帖子
  • 类型解析中存在无限递归,这似乎是 Jackson 中的一个错误。尝试将Cls2 提取到一个独立的类中。
  • @BalusC 辉煌!从过去的一个小时开始,我一直在面对这个问题。谢谢:)
  • 我将其转发为答案。新问题请按。这是题外话(实际上超出了我的范围,因为我从未使用过杰克逊)。

标签: java serialization jackson deserialization


【解决方案1】:

stacktrace 建议在 Cls2 的类型解析中进行无限递归,它扩展了它本身嵌套的类。这似乎是 Jackson 中的一个极端情况错误 (report it!)。同时,将Cls2 提取到一个独立的类中而不是将其嵌套在其超类中应该可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 2012-10-18
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多