将Realm对象作为Retrofit 2 PUT请求体传递

时间:2016-07-20 09:08:00

标签: android gson retrofit realm

我正在尝试使用RealmObject作为Retrofit 2中的PUT消息正文内容。我已经使用JsonSerializer实现了自定义Gson,它在Retrofit之外工作正常,但我仍然没有在请求体中获取对象数据。
用于改造和gson的Gradle构建:

compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

改造服务:

public interface LogstashRetrofitService {
    @PUT(LOGSTASH_SERVER_PATH)
    Call<ResponseBody> putLogstashMessage(@Body LogstashMessage logstashMessage);
}

建筑改造:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(LOGSTASH_SERVER_HOST)
            .addConverterFactory(GsonConverterFactory.create(RealmObjectGsonBuilder.getRealmGson()))
            .client(httpClient.build())
            .build();
logstashRetrofitService = retrofit.create(LogstashRetrofitService.class);
logstashRetrofitService.putLogstashMessage(logstashMessage).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {}
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {}
    });

1 个答案:

答案 0 :(得分:4)

这是因为GSON尝试使用反射基于字段序列化对象,但Realm实例数据只能通过代理getter setter方法访问。

请参阅相关的未解决问题,因为GSON并不关心,因此没有配置来使用getter / setters https://github.com/google/gson/issues/232

这可以使用Jackson或LoganSquare json解析器。

或者,您需要制作RealmObject的非托管副本,可以使用realmObject.copyFromRealm()来创建类的深层副本,与Realm分离。