谷歌GSON造成计算器 [英] google Gson causing a stackoverflow

查看:177
本文介绍了谷歌GSON造成计算器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 错误
 四月七日至14日:33:28.030:E / AndroidRuntime(5216):致命异常:主要
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):工艺:com.tt,PID:5216
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):java.lang.StackOverflowError
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.String._getChars(String.java:908)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:147)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:216)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:154)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Game.toString(Game.java:157)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.util.AbstractCollection.toString(AbstractCollection.java:374)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.java:202)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在com.tt.models.Player.toString(Player.java:161)
    四月七日至14日:33:28.030:E / AndroidRuntime(5216):在java.lang.StringBuilder.append(StringBuilder.ja

我的模型机

 包com.tt.models;
进口java.util.Collection中;
进口com.google.gson.annotations.SerializedName;
进口com.j256.ormlite.field.DatabaseField;
进口com.j256.ormlite.field.ForeignCollectionField;
进口com.j256.ormlite.table.DatabaseTable;@DatabaseTable(tableName值=播放器)
公共类播放器{
    公共静态最后弦乐BATTING_ID_FIELD_NAME =batting_id;
    公共静态最后弦乐BOWLING_ID_FIELD_NAME =bowling_id;
    公共静态最后弦乐TEAM_ID_FIELD_NAME =TEAM_ID;
    @SerializedName(__ V)
    @DatabaseField(ID =真)
     私人诠释身份证;    @SerializedName(_ ID)
    @DatabaseField(COLUMNNAME =_id)
    私人字符串_id;
    / * @ SerializedName(__ V)
    @DatabaseField(COLUMNNAME =__v,ID = TRUE)
    私人诠释__v; * /
    @DatabaseField
    私人字符串battingStyle;
    @DatabaseField
    私人字符串bowlingStyle;
    @DatabaseField
    私人字符串DOB;
    @DatabaseField
    私人字符串playingRole;
    @DatabaseField
    私人字符串SNAME;
    @DatabaseField
    私人字符串FNAME;
    @SerializedName(库)
    @ForeignCollectionField(渴望= TRUE,maxEagerLevel = 2)
    私人收藏<画廊>画廊;    @SerializedName(游戏)
    @ForeignCollectionField(渴望= TRUE)
    私人收藏<游戏及GT;游戏;    / *
     * @DatabaseField(dataType的= DataType.SERIALIZABLE)私有String []用户;
     * /
    / *
     * @DatabaseField(dataType的= DataType.SERIALIZABLE)私有String []小队;
     * /    播放(){    }    公众诠释的getId(){
        返回ID;
    }    公共无效SETID(INT ID){
        this.id = ID;
    }
    公共字符串getBattingStyle(){
        返回battingStyle;
    }    公共无效setBattingStyle(字符串battingStyle){
        this.battingStyle = battingStyle;
    }    公共字符串getBowlingStyle(){
        返回bowlingStyle;
    }    公共无效setBowlingStyle(字符串bowlingStyle){
        this.bowlingStyle = bowlingStyle;
    }    公共字符串getDob(){
        返回出生日期;
    }    公共无效setDob(字符串DOB){
        this.dob = DOB;
    }    公共字符串getPlayingRole(){
        返回playingRole;
    }    公共无效setPlayingRole(字符串playingRole){
        this.playingRole = playingRole;
    }    公共字符串getSname(){
        返回SNAME;
    }    公共无效setSname(字符串SNAME){
        this.sname = SNAME;
    }    公共字符串getFname(){
        返回FNAME;
    }    公共无效setFname(字符串FNAME){
        this.fname = FNAME;
    }    / *
     *公众的String [] getUsers(){回报用户; }
     *
     *公共无效setUsers(字符串[]用户){this.users =用户; }
     * /    / *
     *公众的String [] getSquad(){返回球队; }
     *
     *公共无效setSquad(字符串[]队){this.squad =阵容; }
     * /    公文集<画廊> getGallerys(){
        返回画廊;
    }    公共无效setGallerys(收集和LT;画廊>图库){
        this.gallery =画廊;
    }    公文集<画廊> getGallery(){
        返回画廊;
    }    公共无效setGallery(收集和LT;画廊>图库){
        this.gallery =画廊;
    }    公文集<游戏及GT; getGames(){
        返回游戏;
    }    公共无效setGames(收集和LT;游戏>游戏){
        this.games =游戏;
    }    公共字符串get_id(){
        返回_id;
    }    公共无效set_id(字符串_id){
        this._id = _id;
    }    @覆盖
    公共字符串的toString(){
        返回播放器[ID =+ Integer.toString(ID)+_id =+ _id +,battingStyle =
                + battingStyle +,bowlingStyle =+ bowlingStyle +,DOB =
                + DOB +,playingRole =+ playingRole +,SNAME =+ SNAME
                +,FNAME =+ FNAME +,画廊=+画廊+,游戏=
                +游戏+];
    }
}
和博弈模型
包com.tt.models;进口java.util.Collection中;进口com.google.gson.annotations.SerializedName;
进口com.j256.ormlite.field.DatabaseField;
进口com.j256.ormlite.field.ForeignCollectionField;
进口com.j256.ormlite.table.DatabaseTable;@DatabaseTable(tableName值=游戏)
公共类游戏{
    公共静态最后弦乐INNING_ID_FIELD_NAME =inning_id;
    公共静态最后弦乐PLAYER_ID_FIELD_NAME =player_id;
    @SerializedName(__ V)
    @DatabaseField(ID =真)
     私人诠释身份证;    / * @ SerializedName(_ ID)
    @DatabaseField(COLUMNNAME =_id)
    私人字符串_id;
    @SerializedName(__ V)
    @DatabaseField(COLUMNNAME =__v,ID = TRUE)
    私人诠释__v; * /
    @SerializedName(游戏类型)
    @DatabaseField
    私人字符串游戏类型;
    @SerializedName(名称)
    @DatabaseField
    私人字符串名称;
    @SerializedName(totalOvers)
    @DatabaseField
    私人字符串totalOvers;
    @SerializedName(dateStarted)
    @DatabaseField
    私人字符串dateStarted;
    @SerializedName(dateEnded)
    @DatabaseField
    私人字符串dateEnded;
    @SerializedName(局)
    @ForeignCollectionField(渴望= TRUE,maxEagerLevel = 2)
    私人收藏<围垦>局;
    @DatabaseField(外资= TRUE,foreignAutoCreate = TRUE,foreignAutoRefresh = TRUE,COLUMNNAME = PLAYER_ID_FIELD_NAME)
    私人Player播放器;
    @SerializedName(理由)
    @ForeignCollectionField(渴望= TRUE,maxEagerLevel = 2)
    私人收藏<地面>理由;
    @SerializedName(队)
    @ForeignCollectionField(渴望= TRUE,maxEagerLevel = 2)
    私人收藏<团队及GT;队伍;    公共游戏(){
        //所有坚持类必须定义一个无参数的构造函数至少
        //包可见
    }    / *公共字符串get_id(){
        返回_id;
    }    公共无效set_id(字符串_id){
        this._id = _id;
    } * /    公共字符串getGameType(){
        返回游戏类型;
    }    公众诠释的getId(){
        返回ID;
    }    公共无效SETID(INT ID){
        this.id = ID;
    }    公共无效setGameType(字符串游戏类型){
        this.gameType =游戏类型;
    }    公文集<地面> getGrounds(){
        返回地面;
    }    公共无效setGrounds(收集和LT;地面>理由){
        this.grounds =理由;
    }    公共字符串的getName(){
        返回名称;
    }    公共无效setname可以(字符串名称){
        this.name =名称;
    }    公共字符串getDateStarted(){
        返回dateStarted;
    }    公共无效setDateStarted(字符串dateStarted){
        this.dateStarted = dateStarted;
    }    公共字符串getDateEnded(){
        返回dateEnded;
    }    公共无效setDateEnded(字符串dateEnded){
        this.dateEnded = dateEnded;
    }    公共字符串getTotalOvers(){
        返回totalOvers;
    }    公共无效setTotalOvers(字符串totalOvers){
        this.totalOvers = totalOvers;
    }    公共球员getPlayer(){
        返回的球员;
    }    公共无效setPlayer(Player播放器){
        this.player =玩家;
    }    公文集<围垦> getInnings(){
        回到局;
    }    公共无效setInnings(收集和LT;围垦>局){
        this.innings =局;
    }    公文集<团队及GT; getTeams(){
        返回球队;
    }    公共无效setTeams(收集和LT;团队及GT;团队){
        this.teams =队伍;
    }    @覆盖
    公共字符串的toString(){
        回报的游戏[ID =+ Integer.toString(ID)+,游戏类型=+游戏类型+,NAME =+名字
                +,totalOvers =+ totalOvers +,dateStarted =+ dateStarted
                +,dateEnded =+ dateEnded +,局=+局
                +,玩家=+球员+,理由=+理由+,团队=
                +团队+];
    }    / *公众诠释get__v(){
        返回__v;
    }    公共无效set__v(INT __v){
        这.__ V = __v;
    } * /


解决方案

播放器游戏游戏播放器播放器游戏游戏播放器 ...计算器。

更改类的结构。消除循环引用,或使用瞬态关键字在播放器游戏引用从序列中排除。

编辑:

如果你不希望你的类的结构改变,例如:每个游戏都有参考球员,但球员并没有给他的游戏引用。然后,你可以做这样的事情:


  • 序列化的播放器

  • 玩家将其序列化游戏合集

  • 游戏类应该有私人 瞬态 播放器球员; 字段,
    避免的StackOverflowError

  • 之后的反序列化的玩家应该遍历其游戏和
    game.setPlayer(本); 对他们每个人

另外你需要修复你的的toString()方法。因为播放器类的<​​code>的toString()的方法调用游戏类的的toString()这就要求播放器类的<​​code>的toString()。

当你得到的StackOverflowError 只是寻找这样的事情。或不建的阶级结构是这样,每个播放器有他的游戏,每个游戏播放器

Error    
 07-14 04:33:28.030: E/AndroidRuntime(5216): FATAL EXCEPTION: main
    07-14 04:33:28.030: E/AndroidRuntime(5216): Process: com.tt, PID: 5216
    07-14 04:33:28.030: E/AndroidRuntime(5216): java.lang.StackOverflowError
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.String._getChars(String.java:908)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:147)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:216)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:154)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Game.toString(Game.java:157)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.util.AbstractCollection.toString(AbstractCollection.java:374)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.java:202)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at com.tt.models.Player.toString(Player.java:161)
    07-14 04:33:28.030: E/AndroidRuntime(5216):     at java.lang.StringBuilder.append(StringBuilder.ja

My model player

package com.tt.models;
import java.util.Collection;
import com.google.gson.annotations.SerializedName;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable(tableName = "Player")
public class Player {
    public static final String BATTING_ID_FIELD_NAME = "batting_id";
    public static final String BOWLING_ID_FIELD_NAME = "bowling_id";
    public static final String TEAM_ID_FIELD_NAME = "team_id";
    @SerializedName("__v")
    @DatabaseField(id = true) 
     private int id;

    @SerializedName("_id")
    @DatabaseField(columnName = "_id")
    private String _id;
    /*@SerializedName("__v")
    @DatabaseField(columnName = "__v",id=true)
    private int __v;*/
    @DatabaseField
    private String battingStyle;
    @DatabaseField
    private String bowlingStyle;
    @DatabaseField
    private String dob;
    @DatabaseField
    private String playingRole;
    @DatabaseField
    private String sname;
    @DatabaseField
    private String fname;
    @SerializedName("gallery")
    @ForeignCollectionField(eager = true, maxEagerLevel = 2)
    private Collection<Gallery> gallery;

    @SerializedName("games")
    @ForeignCollectionField(eager = true)
    private Collection<Game> games;

    /*
     * @DatabaseField(dataType = DataType.SERIALIZABLE) private String[] users;
     */
    /*
     * @DatabaseField(dataType = DataType.SERIALIZABLE) private String[] squad;
     */

    Player() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


    public String getBattingStyle() {
        return battingStyle;
    }

    public void setBattingStyle(String battingStyle) {
        this.battingStyle = battingStyle;
    }

    public String getBowlingStyle() {
        return bowlingStyle;
    }

    public void setBowlingStyle(String bowlingStyle) {
        this.bowlingStyle = bowlingStyle;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }

    public String getPlayingRole() {
        return playingRole;
    }

    public void setPlayingRole(String playingRole) {
        this.playingRole = playingRole;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    /*
     * public String[] getUsers() { return users; }
     * 
     * public void setUsers(String[] users) { this.users = users; }
     */

    /*
     * public String[] getSquad() { return squad; }
     * 
     * public void setSquad(String[] squad) { this.squad = squad; }
     */

    public Collection<Gallery> getGallerys() {
        return gallery;
    }

    public void setGallerys(Collection<Gallery> gallery) {
        this.gallery = gallery;
    }

    public Collection<Gallery> getGallery() {
        return gallery;
    }

    public void setGallery(Collection<Gallery> gallery) {
        this.gallery = gallery;
    }

    public Collection<Game> getGames() {
        return games;
    }

    public void setGames(Collection<Game> games) {
        this.games = games;
    }

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    @Override
    public String toString() {
        return "Player [id=" + Integer.toString(id) + ", _id=" + _id + ", battingStyle="
                + battingStyle + ", bowlingStyle=" + bowlingStyle + ", dob="
                + dob + ", playingRole=" + playingRole + ", sname=" + sname
                + ", fname=" + fname + ", gallery=" + gallery + ", games="
                + games + "]";
    }






}
and game model 
package com.tt.models;

import java.util.Collection;

import com.google.gson.annotations.SerializedName;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;

@DatabaseTable(tableName = "Game")
public class Game {
    public static final String INNING_ID_FIELD_NAME = "inning_id";
    public static final String PLAYER_ID_FIELD_NAME = "player_id";
    @SerializedName("__v")
    @DatabaseField(id = true) 
     private int id;

    /*@SerializedName("_id")
    @DatabaseField(columnName = "_id")
    private String _id;
    @SerializedName("__v")
    @DatabaseField(columnName = "__v",id=true)
    private int __v;*/
    @SerializedName("gameType")
    @DatabaseField
    private String gameType;
    @SerializedName("name")
    @DatabaseField
    private String name;
    @SerializedName("totalOvers")
    @DatabaseField
    private String totalOvers;
    @SerializedName("dateStarted")
    @DatabaseField
    private String dateStarted;
    @SerializedName("dateEnded")
    @DatabaseField
    private String dateEnded;
    @SerializedName("innings")
    @ForeignCollectionField(eager = true, maxEagerLevel = 2)
    private Collection<Inning> innings;
    @DatabaseField(foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true, columnName = PLAYER_ID_FIELD_NAME)
    private Player player;
    @SerializedName("grounds")
    @ForeignCollectionField(eager = true, maxEagerLevel = 2)
    private Collection<Ground> grounds;
    @SerializedName("teams")
    @ForeignCollectionField(eager = true, maxEagerLevel = 2)
    private Collection<Team> teams;

    public Game() {
        // all persisted classes must define a no-arg constructor with at least
        // package visibility
    }



    /*public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }*/

    public String getGameType() {
        return gameType;
    }

    public int getId() {
        return id;
    }



    public void setId(int id) {
        this.id = id;
    }



    public void setGameType(String gameType) {
        this.gameType = gameType;
    }

    public Collection<Ground> getGrounds() {
        return grounds;
    }

    public void setGrounds(Collection<Ground> grounds) {
        this.grounds = grounds;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDateStarted() {
        return dateStarted;
    }

    public void setDateStarted(String dateStarted) {
        this.dateStarted = dateStarted;
    }

    public String getDateEnded() {
        return dateEnded;
    }

    public void setDateEnded(String dateEnded) {
        this.dateEnded = dateEnded;
    }

    public String getTotalOvers() {
        return totalOvers;
    }

    public void setTotalOvers(String totalOvers) {
        this.totalOvers = totalOvers;
    }

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public Collection<Inning> getInnings() {
        return innings;
    }

    public void setInnings(Collection<Inning> innings) {
        this.innings = innings;
    }

    public Collection<Team> getTeams() {
        return teams;
    }

    public void setTeams(Collection<Team> teams) {
        this.teams = teams;
    }



    @Override
    public String toString() {
        return "Game [id=" + Integer.toString(id) + ", gameType=" + gameType + ", name=" + name
                + ", totalOvers=" + totalOvers + ", dateStarted=" + dateStarted
                + ", dateEnded=" + dateEnded + ", innings=" + innings
                + ", player=" + player + ", grounds=" + grounds + ", teams="
                + teams + "]";
    }

    /*public int get__v() {
        return __v;
    }

    public void set__v(int __v) {
        this.__v = __v;
    }*/

解决方案

Player has Game, Game has Player, Player has Game, Game has Player... stackoverflow.

Change the structure of your classes. Eliminate circular references, or use transient keyword on Player or Game reference to exclude it from the serialization.

EDIT:

If you don't want to change the structure of your classes to for example: each Game has reference to the Player, but the Player doesn't have references to his Games. Then you may do something like this:

  • serialize the Player
  • Player will serialize its Games collection
  • the Game class should have privatetransientPlayer player; field, to avoid StackOverflowError
  • After deserialization the Player should iterate over its Games and call game.setPlayer(this); on each of them

Also you need fix your toString() methods. Because Player class's toString() method calls Game class's toString() which calls Player class's toString().

When you get StackOverflowError just look for things like this. Or don't build class structures like this, where each Player has his Games, and each Game has its Player.

这篇关于谷歌GSON造成计算器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆