2017-02-16 51 views
0

我對使用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(即使它按照默認方法進行序列化)。

+0

我並不熟悉Realm,但問題可能在於UserSerializer在爲您的類註冊適配器時請求用戶io.realm.UserProxy –

+4

您是否檢查過[此答案](http://stackoverflow.com/a/42044320/3503855)?它提供了一種**更簡單的方法來解決Gson + Realm的不兼容問題。 – AnixPasBesoin

+0

不幸的是,這不會幫助我解決具體問題(我在下面找到了一個解決方案),但是對於任何人Retrofit-Gson的問題,我都會指出這個問題,我幾個星期前處理過同樣的情況,找出發生了什麼事。 – jwBurnside

回答

0

所以,如果我的註冊用戶類型適配器:

registerTypeAdapter(User.class, new UserSerializer()) 

代替:

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

用戶序列化程序被調用。我仍然不知道爲什麼,但它的工作原理。

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()) 
+0

我試圖用相同的結果。 – jwBurnside

+0

如果你只註冊UserSerializer,它的工作原理是什麼?請爲該序列化程序添加代碼 –

+0

我已添加用戶序列化程序。我無法測試註冊「僅」用戶序列化程序,因爲gson由於FavoriteSong和Song引用而引發合體。 – jwBurnside