我的自定义序列化程序与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(即使它根据默认方法进行序列化)。
答案 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())
调用用户序列化程序。我仍然不知道为什么,但它确实有效。