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

标签 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) {}
    });

最佳答案

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

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

这可以通过 Jackson 或 LoganSquare json 解析器实现。

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

关于android - 将 Realm 对象作为 Retrofit 2 PUT 请求主体传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38476940/

相关文章:

java - 为什么我的 startActivityForResult() 在将 ArrayList<String> 转换为 String[] 时返回 null?

java - YouTube Api v3:列出播放列表视频

android - 如何解决延迟加载位图中的 vm budget memory heap 错误?

java - 尝试将 GSON 与自己的类一起使用时出错

java - 如何用 Gson 序列化扩展 Collection 的对象?

java - GSON 将 json 字符串转换为对象;获取空值和 0

在 Java 中改造 protobuf-lite 转换器

android - 与混合应用程序的改造集成

error-handling - Rxjava 和改造错误处理不起作用

android - Ionic 5 Android 应用程序因使用 Paypal 而不是应用内计费而被拒绝