【发布时间】:2017-02-16 19:10:15
【问题描述】:
我的自定义序列化程序与 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 有一个Artist。我的序列化器设置非常相似,这里是 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(即使它根据默认方法进行序列化)。
【问题讨论】:
-
我不熟悉领域,但问题可能是例如当您为类 io.realm.UserProxy 注册适配器时,UserSerializer 需要一个用户
-
你检查过this answer吗?它提供了一种更简单的方法来解决 Gson+Realm 不兼容问题。
-
不幸的是,这对我的具体问题没有帮助(我在下面找到了一个解决方案),但对于任何人的 Retrofit-Gson 问题,绝对可以指出这一点,我在几周内处理了同样的情况之前,花了一段时间才弄清楚发生了什么。
标签: android gson realm retrofit