programing

GSON이 인터페이스 타입에 대해 타입 어댑터를 호출하지 않음

powerit 2023. 3. 4. 15:13
반응형

GSON이 인터페이스 타입에 대해 타입 어댑터를 호출하지 않음

GSON은 공개적으로 접근할 수 있는 속성 정보를 사용하는 대신 JavaBeans의 내부 필드를 보는 일종의 속임수를 쓰고 있는 것 같습니다.안타깝게도 마법처럼 만들어진 콩이 개인 밭으로 가득 차서 저장하기 싫어서 날아갈 수 없습니다.

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

물론 타입 어댑터는 호출하지 않기 때문에 다른 동작을 취할 수 없는 것 같습니다.

Gson 버전 2.3.1에서도 같은 문제가 있었습니다.를 사용하여 작동시켰다.

.registerTypeHierarchyAdapter(Player.class, new PlayerTypeAdapter())

대신

.registerTypeAdapter(Player.class, new PlayerTypeAdapter())

GSON의 현재 릴리스는 이와 같이 동작하지 않습니다.어댑터를 사용하여 유형을 직렬화합니다.

gson.toJson(bean, Player.class)

다른 방법으로 등록하실 수 있습니다.PlayerTypeAdapter위해서MagicPlayer.class기존 코드가 작동합니다.GSON이 검색하다TypeAdapter콘크리트(또는 최상위 레벨) 유형만.따라서 발생할 수 있는 모든 콘크리트 유형에 대해 사용자 지정 유형 어댑터를 등록해야 합니다.

있어TypeHeirarchyAdapter당신이 같은 것을 원할 때TypeAdapter특정 유형의 모든 확장 클래스에 사용됩니다.하지만 나는 이것에 대해 운이 좋지 않았고 왜 그것이 나에게 잘 작동하지 않는지 알아보는 데 시간을 쓰지 않았다.다음은 관련 설명입니다.https://groups.google.com/forum/ ?from groups=#!searchin/google-gson/interface/google-gson/0ebOxifqwb0/OXSCNtiLpBQJ

동작하지 않는 이유:

  1. PlayerTypeAdapter는 JsonSerializer를 구현해야 합니다.그런가요?

  2. 만약 그렇다면, 그것은 효과가 있을 것이다.나한테는 딱 맞는데 왜 안 맞나 보지 마.응용 프로그램을 디버깅으로 시작하고 중단점을 입력한 후 체크아웃합니다.무슨 이유가 있을 거야

테스트에서 어댑터가 있는 Gson Builder는 어디에 있습니까?변경해야 합니다.

public void testJson() throws Exception
{
    Player player = new MagicPlayer(); //BeanUtils.createDefault(Player.class);
    player.setName("Alice");

    // this is wrong if you want adapter
    /* Gson gson = new Gson(); */

    // this is what you nead
     Gson gson = new GsonBuilder()
        .registerTypeAdapter(Player.class, new PlayerTypeAdapter())
        .create();

    System.out.println(gson.toJson(bean));
}

언급URL : https://stackoverflow.com/questions/10631250/gson-not-calling-my-typeadapter-for-a-type-which-is-an-interface

반응형