As it was said in previous answers for serialize RealmObject
with Gson the appropriate JsonSerializer
should be registered at Gson instance. Below my example of an universal JsonSerializer
for Gson that works with getters instead of fields.
Firstly, it should be registered with Gson in order to use like this:
@NonNull private static Gson createGson() {
GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
try {
gsonBuilder.registerTypeAdapter(Class.forName("io.realm.<YourClassName1>RealmProxy"), Serializer.newInstance(<YourClassName1>.class));
gsonBuilder.registerTypeAdapter(Class.forName("io.realm.<YourClassName2>RealmProxy"), Serializer.newInstance(<YourClassName2>.class));
...
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return gsonBuilder.create();
}
And then it is possible to get JSON from any RealmObject-derived (and even created by Realm) class like this:
public class MessageModel extends RealmObject { ... }
String json = createGson().toJson(messageModelInstance);
And you can copy MessageModel
like this:
MessageModel src= ...;
MessageModel dst= ...;
Serializer.newInstance(MessageModel.class).copy(src, dst);
And here Serializer
public class Serializer<T> implements JsonSerializer<T> {
private Class<T> clazz;
private Serializer(Class<T> clazz) {this.clazz = clazz;}
@NonNull
public static <T> Serializer<T> newInstance(Class<T> clazz) {return new Serializer<T>(clazz);}
@Override
public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) {
final JsonObject jsonObject = new JsonObject();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (f.isAnnotationPresent(Expose.class)) try {
String name = f.getName();
String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = src.getClass().getMethod(methodName);
Object o = method.invoke(src);
if (o instanceof String) {
jsonObject.addProperty(name, (String) o);
}
else if (o instanceof Number) {
jsonObject.addProperty(name, (Number) o);
}
else if (o instanceof Boolean) {
jsonObject.addProperty(name, (Boolean) o);
}
else if (o instanceof Character) {
jsonObject.addProperty(name, (Character) o);
}
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return jsonObject;
}
public <T> void copy(T src, T dst) {
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (f.isAnnotationPresent(Expose.class)) try {
String name = f.getName();
String getterName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
String setterName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method getter = clazz.getMethod(getterName);
Method setter = clazz.getMethod(setterName, f.getType());
setter.invoke(dst, getter.invoke(src));
} catch (Exception e) {
e.printStackTrace();
checkState(false);
}
}
}
}