正如在之前使用Gson序列化的答案中所说的那样,应该在Gson实例中注册适当的答案。下面我举了一个通用的Gson示例,它适用于getter而不是字段。RealmObjectJsonSerializerJsonSerializer
首先,它应该在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);
            }
        }
    }
}