Mam trochę problemu z moimi niestandardowymi serializatorami pracującymi z modernizacją, Realmem i Gsona. Tutaj rejestruję adaptery typu dla moich trzech klas:

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();

Użytkownik ma ulubione, a ulubionegiem ma artystę. Moje serializatory są założone bardzo podobnie, oto przykład dla ulubionychSerialializer.

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;
    }

}

Oto serializator użytkownika:

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;
    }
}

Dziwna część jest, zarówno serializatory Ulubione, jak i pieśni są wywoływani, gdy wysyłam moją prośbę (widzę instrukcje dziennika), ale Użytkownicy nie jest. Czy ktoś wie, dlaczego to się dzieje, lub jak mogę rozwiązać problem?

/** Edytować **/

Tak więc jako test stworzyłem testmodel, który zawiera identyfikator, utworzyłem dla niego serializatora, zarejestrowałem adapter typu i dodałem go do mojego modelu użytkownika. I nie zadzwoni do testmodelsyzerii (mimo że serializuje się zgodnie z domyślną metodą).

1
jwBurnside 16 luty 2017, 22:10

2 odpowiedzi

Najlepsza odpowiedź

Więc jeśli zarejestruj mój adapter typu użytkownika jako:

registerTypeAdapter(User.class, new UserSerializer())

Zamiast:

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

Wezwany jest serializator użytkownika. Nadal nie mam pojęcia dlaczego, ale działa.

0
jwBurnside 17 luty 2017, 15:32

Spróbuj z registerTypeHierarchyAdapter zamiast registerTypeAdapter:

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

EDYTOWAĆ:

 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
Matias Elorriaga 16 luty 2017, 20:45