티스토리 뷰
이전에 올렸던 포스팅중에 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 |
Objects 클래스 (3) | 2017.12.21 |
이름 재사용 관련된 용어들 (0) | 2017.11.08 |
nio 패키지를 이용한 텍스트 파일 입출력 (0) | 2017.10.09 |
- Total
- Today
- Yesterday
- Git
- JavaScript Core
- javascript
- http
- clean code
- frontend개발환경
- code
- servlet
- programming
- Design Pattern
- frontcode
- go-core
- JPA
- MySQL
- spring cloud
- db
- java
- DesignPattern
- Kotlin
- toby
- OOP
- java8
- Spring
- generics
- backend개발환경
- TEST
- 정규표현식
- EffectiveJava
- Jackson
- mariadb
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |