티스토리 뷰

이전에 올렸던 포스팅중에 Custom Serializer, Deserializer 만들기 가 있었다. 작성해놓고 나 스스로도 자주 다시보며 유용하게 써먹었던 포스팅인데 이번에 한가지 추가적인 경우를 맞이했다.


해당 필드에 특정 애노테이션이 달려있으면 기본 Serializer 를 사용하고, 없을 경우엔 CustomSerializer 를 사용


이라는 경우였다.


일단 애노테이션이 붙었는지를 먼저 검사해야하는데 그럴땐 리플렉션을 쓸수밖에 없었다. 그런데 직렬화를 할때마다 리플렉션을 사용하는건 비용이 좀 크지않나 라는 생각이 들었다. 그리고 분명히 이런 고민을 전세계에서 꽤 많이 했을 것 같은데 너무 원시적으로 문제를 해결하려는게 아닌가 라는 생각에 이리저리 검색을 좀 해봤다.


역시 이런고민은 이미 수많은 지구인들이 나보다 앞서 해주었었다. JsonSerializer<T> 만 확장할 경우엔 애노테이션 정보를 얻을 수 없다. 추가적으로 ContextualSerializer 인터페이스를 구현해주면 createContextual() 메서드를 구현해줘야 하는데 두번째 인자로 넘어오는 BeanProperty 를 이용해 애노테이션 정보를 구할 수 있다.


public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
throws JsonMappingException;


CustomSerializer 가 JsonSerializer<T> 와 ContextualSerializer 모두 구현할 경우 createContextual() 메서드가 먼저 호출되므로 편하게 구현해주면 된다.


@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws
JsonMappingException {
if(property.getAnnotation(JsonFormat.class) == null){
return this;
}

return new Jsr310NullKeySerializer();
}


구현자체는 간단하다. 하나 알고갈건 return this; 구문인데 애노테이션이 없으면 지금 메서드를 실행중인 Serializer 를 사용할 것이므로 this 를 리턴해주면 된다. 여기서 굳이 new CustomSerializer(); 를 리턴해도 동작엔 문제가 없겠으나 불필요한 객체생성이므로 바람직해보이진않는다.

'Java' 카테고리의 다른 글

역어셈블리  (0) 2018.01.07
Builder Pattern  (0) 2017.12.31
Jackson Serialize 시 클래스 정보가 필요할때  (0) 2017.12.28
Objects 클래스  (3) 2017.12.21
이름 재사용 관련된 용어들  (0) 2017.11.08
nio 패키지를 이용한 텍스트 파일 입출력  (0) 2017.10.09
공유하기 링크
TAG
댓글
댓글쓰기 폼