2017-02-16 17 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を作成したテストなどの編集**/

、それのためのシリアライザを作成したが、タイプのアダプタを登録して、私のUserモデルにこれを追加しました。また、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()) 

EDIT:

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

私はUserシリアライザを追加しました。 gsonがFavoriteSongとSongの参照のために適合を投げているので、私はUserシリアライザの "only"登録をテストすることはできません。 – jwBurnside

関連する問題