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
동작하지 않는 이유:
PlayerTypeAdapter는 JsonSerializer를 구현해야 합니다.그런가요?
만약 그렇다면, 그것은 효과가 있을 것이다.나한테는 딱 맞는데 왜 안 맞나 보지 마.응용 프로그램을 디버깅으로 시작하고 중단점을 입력한 후 체크아웃합니다.무슨 이유가 있을 거야
테스트에서 어댑터가 있는 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
'programing' 카테고리의 다른 글
set php 라디오 버튼은 기본적으로 선택되어 있습니다. (0) | 2023.03.04 |
---|---|
다른 인수를 사용하여 동일한 URL 패턴에 대해 두 가지 메서드를 만듭니다. (0) | 2023.03.04 |
AngularJS - 컨트롤러에서 날짜 변환 (0) | 2023.03.04 |
상위 상태 변경 후 하위 구성 요소가 업데이트되지 않음 (0) | 2023.03.04 |
Django에서 AJAX 게시 후 리다이렉트 (0) | 2023.03.04 |