正如之前在使用 Gson 进行序列化的答案中所说的那样,应该在 Gson 实例中注册RealmObject
适当的。JsonSerializer
下面是一个通用JsonSerializer
的 Gson 示例,它使用 getter 而不是字段。
首先,它应该向 Gson 注册以便像这样使用:
@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();
}
然后可以从任何 RealmObject 派生(甚至由 Realm 创建)类中获取 JSON,如下所示:
public class MessageModel extends RealmObject { ... }
String json = createGson().toJson(messageModelInstance);
你可以MessageModel
这样复制:
MessageModel src= ...;
MessageModel dst= ...;
Serializer.newInstance(MessageModel.class).copy(src, dst);
和这里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);
}
}
}
}