2017-02-16 8 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 не является. Кто-нибудь знает, почему это может произойти, или как я могу устранить неполадки?

/** Редактировать **/

Так как тест я создал TestModel, который содержит только идентификатор, созданный сериалайзер для него, зарегистрирован адаптер типа, и добавить его к моей модели пользователя. И он также не может вызвать TestModelSerializer (даже если он сериализуется в соответствии со стандартным методом).

+0

Я не знаком с Королевством, но проблема может быть в том, что, например, UserSerializer запрашивает пользователя во время регистрации адаптера для класса io.realm.UserProxy –

+4

Вы проверили [этот ответ] (http://stackoverflow.com/a/42044320/3503855)? Это обеспечивает ** намного более простой способ обхода Gons + 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 serializer. Я не могу протестировать регистрацию «только» пользовательского сериализатора, потому что gson сбрасывает подгонку из-за ссылок FavoriteSong и Song. – jwBurnside

Смежные вопросы