Я могу предложить вам использовать разные объекты для разных целей (сохранение в Room
дБ и сериализация в json
).
Вам необходим интерфейс вашей Item сущности:
public interface Item {
int getId();
//other fields
}
Тогда вам нужна конкретная реализация для сущности Room
db. То, что у вас уже есть, но нужно сделать тот же рефакторинг:
@Entity(tableName = "items", indices = {@Index(value = {"id"}, unique = true), @Index(value = {"owner", "type"})})
public class RoomItem implements Item {
@PrimaryKey
@NonNull
private int id;
//other fields
public RoomItem() {
}
public RoomItem(Item item) {
id = item.getId();
}
@Override
public int getId() {
return 0;
}
@Override
public void setId(int id) {
this.id = id;
}
//other getters and setters
}
Кроме того, вам нужно избавиться от внутреннего статического класса ItemInfo и сделать его в отдельном .java
файле.
И, наконец, вам нужна конкретная реализация для Gson
сущности:
public class GsonItem implements Item {
private final int id;
public GsonItem(Item origin) {
id = origin.getId();
}
@Override
public int getId() {
return id;
}
}
В этом случае вы сможете использовать его без проблем:
Gson gson = new Gson();
String result = gson.toJson(new GsonItem(item));
Да, этот подход заставляет вас написать немного больше кода, но отсутствие неожиданных проблем, подобных вашей, определенно стоит усилий!