GSON не вызывает мой TypeAdapter для типа, который является интерфейсом.

Похоже, что GSON проделывает некий трюк, просматривая внутренние поля моих JavaBeans вместо использования общедоступной информации о свойствах. К сожалению, это не сработает для нас, потому что наши волшебным образом созданные bean-компоненты полны частных полей, которые я не хочу хранить.

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

Это дает:

{"privateStuff":"secret","name":"Alice"}

И, конечно же, никогда не вызывает мой адаптер типа, что, по-видимому, делает невозможным любое другое поведение.

31
задан Trejkaz 20 May 2012 в 23:58
поделиться