GSON ruft meinen TypeAdapter nicht für einen Typ auf, der eine Schnittstelle ist

GSON scheint einen Trick zu machen, bei dem es die internen Felder meiner JavaBeans untersucht, anstatt die öffentlich zugänglichen Eigenschaftsinformationen zu verwenden. Leider wird dies für uns nicht fliegen, weil unsere magisch hergestellten Bohnen voll von privaten Feldern sind, die ich nicht abspeichern möchte.

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

Das gibt:

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

Und natürlich nenne ich niemals meinen Typadapter, was es anscheinend unmöglich macht, ein anderes Verhalten zu bekommen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage