谷歌GSON造成计算器 [英] google Gson causing a stackoverflow
问题描述
错误
四月七日至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
private
transient
Player player;
field, to avoidStackOverflowError
- 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屋!