Parece que GSON está haciendo algún tipo de truco cuando mira los campos internos de mis JavaBeans en lugar de utilizar la información de propiedad de acceso público. Desafortunadamente, esto no nos volará porque nuestros granos mágicamente creados están llenos de campos privados que no quiero almacenar.GSON no llama a mi TypeAdapter para un tipo que es una interfaz
@Test
public void testJson() throws Exception
{
Player player = new MagicPlayer(); //BeanUtils.createDefault(Player.class);
player.setName("Alice");
Gson gson = new GsonBuilder()
.registerTypeAdapter(Player.class, new PlayerTypeAdapter())
.create();
System.out.println(gson.toJson(bean));
}
private static class PlayerTypeAdapter implements JsonSerializer<Player>
{
@Override
public JsonElement serialize(Player player, Type type,
JsonSerializationContext context)
{
throw new RuntimeException("I got called, woohoo");
}
}
public static interface Player //extends SupportsPropertyChanges
{
public String getName();
public void setName(String name);
}
// Simple implementation simulating what we're doing.
public static class MagicPlayer implements Player
{
private final String privateStuff = "secret";
private String name;
@Override
public String getName()
{
return name;
}
@Override
public void setName(String name)
{
this.name = name;
}
}
Esto da:
{"privateStuff":"secret","name":"Alice"}
Y, por supuesto, nunca llama mi adaptador tipo, lo que aparentemente hace que sea imposible conseguir cualquier otro comportamiento.
Podría Agrega el código que llama a Gson.toJson()? –
No está claro si este es el mismo problema, pero me encontré con algo similar hace un tiempo, quizás te ayude: http://stackoverflow.com/questions/5952595/serializing-list-of-interfaces-gson/15557654# 15557654 – dimo414