It is better to use JsonSerializer
and JsonDeserializer
rather than TypeAdapter
for your RealmObject
, because of 2 reasons:
-
They allow you to delegate (de)serialization for your
RealmObject
to the default Gson (de)serializer, which means you don’t need to write the boilerplate yourself. -
There’s a weird bug in Gson 2.3.1 that might cause a
StackOverflowError
during deserialization (I tried theTypeAdapter
approach myself and encountered this bug).
Here’s how (replace Tag
with your RealmObject
class):
(NOTE that context.serialize
and context.deserialize
below are equivalent to gson.toJson
and gson.fromJson
, which means we don’t need to parse the Tag
class ourselves.)
Parser + serializer for RealmList<Tag>
:
public class TagRealmListConverter implements JsonSerializer<RealmList<Tag>>,
JsonDeserializer<RealmList<Tag>> {
@Override
public JsonElement serialize(RealmList<Tag> src, Type typeOfSrc,
JsonSerializationContext context) {
JsonArray ja = new JsonArray();
for (Tag tag : src) {
ja.add(context.serialize(tag));
}
return ja;
}
@Override
public RealmList<Tag> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
RealmList<Tag> tags = new RealmList<>();
JsonArray ja = json.getAsJsonArray();
for (JsonElement je : ja) {
tags.add((Tag) context.deserialize(je, Tag.class));
}
return tags;
}
}
Tag class:
@RealmClass
public class Tag extends RealmObject {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Then register your converter class with Gson:
Gson gson = new GsonBuilder()
.registerTypeAdapter(new TypeToken<RealmList<Tag>>() {}.getType(),
new TagRealmListConverter())
.create();