Android Retrofit + Realm + Gson:不称为

时间:2017-02-16 19:10:15

标签: android gson realm retrofit

我的自定义序列化程序与Retrofit,Realm和Gson一起使用时遇到了一些问题。在这里,我正在为我的三个类注册类型适配器:

GsonBuilder builder = new GsonBuilder();
        // Register type adapters to modify outgoing json according to server requirements.
        try {
            builder
                    .registerTypeAdapter(Class.forName("io.realm.UserProxy"), new UserSerializer())
                    .registerTypeAdapter(Class.forName("io.realm.FavoriteSongProxy"), new FavoriteSongSerializer())
                    .registerTypeAdapter(Class.forName("io.realm.ArtistProxy"), new ArtistSerializer())
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }

        Gson gson = builder.create();

        return new Retrofit.Builder()
                .baseUrl("http://10.0.3.2:8080/myUrl/rest/v1/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient.build())
                .build();

用户拥有FavoriteSong,而FavoriteSong拥有艺术家。我的序列化程序设置非常相似,这是FavoriteSongSerializer的一个示例。

public class FavoriteSongSerializer implements JsonSerializer<FavoriteSong> {
    @Override
    public JsonElement serialize(FavoriteSong src, Type typeOfSrc, JsonSerializationContext context) {
        Log.v("qwer", "serializingFavoriteSong");
        final JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("id", src.getId());
        jsonObject.add("song", context.serialize(src.getSong()));
        return jsonObject;
    }

}

以下是用户序列化程序:

public class UserSerializer implements JsonSerializer<User> {
    @Override
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        Log.v("qwer", "serializingUser");
        final JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("id", src.getId());
        jsonObject.add("favoriteSong", context.serialize(src.getFavoriteSong()));
        return jsonObject;
    }
}

奇怪的是,当我发送请求时,我会调用FavoriteSong和Song序列化程序(我可以看到日志语句),但UserSerializer却没有。任何人都知道为什么会发生这种情况,或者我如何排除故障?

/ **编辑** /

因此,作为测试,我创建了一个仅包含id的TestModel,为其创建了一个序列化程序,注册了一个类型适配器,并将其添加到我的User模型中。并且它也无法调用TestModelSerializer(即使它根据默认方法进行序列化)。

2 个答案:

答案 0 :(得分:0)

尝试使用registerTypeHierarchyAdapter代替registerTypeAdapter

.registerTypeHierarchyAdapter(Class.forName("io.realm.UserProxy"), new UserSerializer())

编辑:

 builder
     .setExclusionStrategies(new ExclusionStrategy() {
          @Override
          public boolean shouldSkipField(FieldAttributes f) {
              return f.getDeclaringClass().equals(RealmObject.class);
          }

          @Override
          public boolean shouldSkipClass(Class<?> clazz) {
              return false;
          }
      })
     .registerTypeAdapter(Class.forName("io.realm.UserProxy"), new UserSerializer())
     .registerTypeAdapter(Class.forName("io.realm.FavoriteSongProxy"), new FavoriteSongSerializer())
     .registerTypeAdapter(Class.forName("io.realm.ArtistProxy"), new ArtistSerializer())

答案 1 :(得分:0)

因此,如果将我的用户类型适配器注册为:

registerTypeAdapter(User.class, new UserSerializer())

而不是:

.registerTypeAdapter(Class.forName("io.realm.UserProxy"), new UserSerializer())

调用用户序列化程序。我仍然不知道为什么,但它确实有效。