我對使用Retrofit,Realm和Gson的自定義串行器有點問題。在這裏,我註冊類型的適配器爲我三類:Android 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,宋串行被稱爲當我將我的要求(我可以看到日誌語句),但UserSerializer不是。任何人都知道爲什麼會發生這種情況,或者我可能會排除故障?
/**編輯**/
因此,作爲一個測試,我創建了一個只包含一個ID的TestModel,創造了一個串行它,註冊了一個類型的適配器,並將其添加到我的用戶模型。它也無法調用TestModelSerializer(即使它按照默認方法進行序列化)。
我並不熟悉Realm,但問題可能在於UserSerializer在爲您的類註冊適配器時請求用戶io.realm.UserProxy –
您是否檢查過[此答案](http://stackoverflow.com/a/42044320/3503855)?它提供了一種**更簡單的方法來解決Gson + Realm的不兼容問題。 – AnixPasBesoin
不幸的是,這不會幫助我解決具體問題(我在下面找到了一個解決方案),但是對於任何人Retrofit-Gson的問題,我都會指出這個問題,我幾個星期前處理過同樣的情況,找出發生了什麼事。 – jwBurnside