pardom-zz / ActiveAndroid

Active record style SQLite persistence for Android
http://www.activeandroid.com
4.7k stars 1.03k forks source link

Model class causing StackOverflowError with GSON #108

Open AaronRietschlin opened 11 years ago

AaronRietschlin commented 11 years ago

I am attempting to use GSON in combination with ActiveAndroid. My process is this: I make an HTTP call to a server that returns a JSON response and then I use GSON to serialize it into my object that extends the Model class. This works on all devices except those that run Android 4.2 and above. I believe it has to do with this issue: https://code.google.com/p/google-gson/issues/detail?id=440

The reason I am posting this as an issue is because I traced it to the Model class. I was able to reproduce this with the following.

A test POJO:

public class TestItem /*extends Model*/{

    @Column(name="test")
    @SerializedName("test")
    public String test;

    @Column(name="test2")
    @SerializedName("test2")
    public String test2;

    @Column(name="test3")
    @SerializedName("test3")
    public TestItem2 test3;

    public TestItem(){
          // super();
    }
}

Another test POJO:

public class TestItem2 /*extends Model*/ {
    @Column(name="test")
    @SerializedName("test")
    public String test;

    @Column(name="test2")
    @SerializedName("test2")
    public String test2;

    @Column(name="test3")
    @SerializedName("test3")
    public TestItem test3;

    public TestItem2(){
          // super();
    }
}

And my test JSON:

private String jsonTest2 = "{\"test\":\"test\",\"test2\":\"test2\",\"test3\":{\"test\":\"testing\",\"test3\":{}}}";

As you can see, it's a very simple case. Also, note this has the ActiveAndroid components commented out (except for the annotations). This works just fine with GSON and serializes perfectly. However, as soon as I uncomment the ActiveAndroid components (the "extends Model" and the "super();"), the error occurs.

For reference, this is the error:

08-28 13:00:53.099: E/AndroidRuntime(28681): FATAL EXCEPTION: main
08-28 13:00:53.099: E/AndroidRuntime(28681): java.lang.StackOverflowError
08-28 13:00:53.099: E/AndroidRuntime(28681):    at java.lang.Class.isArray(Class.java:1208)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:331)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.Gson.getAdapter(Gson.java:353)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.Gson.getAdapter(Gson.java:353)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82)
08-28 13:00:53.099: E/AndroidRuntime(28681):    at com.google.gson.

Also note: I've tested with two versions of GSON: 2.2 and 1.7.1. This issue does not occur with 1.7.1

joshuapinter commented 10 years ago

@Nemisis I've into the exact same issue, were you able to figure this out over the last 7 months?

Many thanks!

spurdow commented 10 years ago

@Nemisis do you have fix for this?

vinitius commented 9 years ago

I know it's late but I was able to bypass this problem by setting the mType field to transient at com/activeandroid/TableInfo.java since I didn't need this field to be serialized anyway.

dmitrikudrenko commented 9 years ago

What about fix?