使用新的Gson()。toJson(对象)无限循环

时间:2017-06-18 05:11:04

标签: android realm gson

我有2个表使用序列号 Culinary CulinaryMenu 扩展 RealmObject ,实现 Serializable Culinary hasMany CulinaryMenu,如以下代码所示:

public class Culinary extends RealmObject implements Serializable {
    @PrimaryKey
    private Integer id;
    private String name;
    private RealmList<CulinaryMenu> menus;
}

public class CulinaryMenu extends RealmObject {
    @PrimaryKey
    private Integer id;
    private String name;
}

我想使用下面的代码将 CulinaryMenu 对象转换为 Gson string ,但无效。它将耗尽内存而不是完成(CulinaryMenu有3个对象):

culinary = realm.where(Culinary.class).equalTo(AppConst.COLUMN_ID, 1).findFirst();
for (CulinaryMenu menu : culinary.getMenus()) {        
    System.out.println("CULINARY MENU: " + new Gson().toJson(menu));    
}

如果我说明我正在使用的对象类,它将返回null:

culinary = realm.where(Culinary.class).equalTo(AppConst.COLUMN_ID, 1).findFirst();
for (CulinaryMenu menu : culinary.getMenus()) {        
    System.out.println("CULINARY MENU: " + new Gson().toJson(menu, CulinaryMenu.class));    
}

有什么问题?请赐教。

2 个答案:

答案 0 :(得分:3)

解决。必须使用realm.copyFromRealm(class)。我的工作代码:

culinary = realm.where(Culinary.class).equalTo(AppConst.COLUMN_ID, 1).findFirst();
List<CulinaryMenu> menus = realm.copyFromRealm(culinary.getMenus());
for (CulinaryMenu menu : menus) {        
    System.out.println("CULINARY MENU: " + new Gson().toJson(menu));    
}

我怀疑问题是当我使用 culinary = realm.where().. 时,返回仍然具有模型之间领域关系的领域数据对象(Culinary有CulinaryMenu作为孩子; CulinaryMenu有Culinary作为父级。这些数据由gson使用,产生无限循环)。所以我们切断了“物品”领域,只使用带有命令的纯对象: realm.copyFromRealm()

答案 1 :(得分:0)

你可以这样尝试

@Expose  private RealmList<CulinaryMenu> menus;

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();