이번엔 다른 예제로 writeReplace와 readResolver를 사용해보자..

얕은 지식으론 설명에 한계가 있기 때문에 그냥 이럴때 이렇게 사용한다더라.. 정도의 상황 설명이....


다음과 같은 Json객체를 직렬화 하려고 한다. 물론 설명을 위해 억지로 만들어진 객체이다 - -;;


앞서 Person객체를 직렬화 했던 방법과 동일하다. 그러나.......


테스트는 통과하지 못하고..

Json객체가 필드로 가지고 있는 JsonObject객체를 직렬화 할수 없다는 예외가 발생한다.

JsonObject객체는 Serializable를 구현하지 않은 객체라서 직렬화 할수 없었다.


물론 필드를 직렬화에 포함시키지 않는 방법이 있다.

 * 참고 - private transient JsonObject jso;


암튼, 미션은 JsonObject도 함께 직렬화를 해야한다는 것인데.. (수석님이 여러가지 꼼수들을 보여주셨지만 그건 패스하고...- -;;)

writeReplace와 readResolve를 사용해서 해결한다.


writeReplace 할때 Proxy객체를 하나 정의해서 jsonString을 잠시 보관하고 Proxy객체를 리턴한다.

그리고 읽어올땐 Proxy객체에 정의된 readResolve를 통해 다시 Json객체를 생성해서 리턴한다.

둘다 리턴되는 값은 Serializable를 구현한 객체만 가능하다.


상당히 간단한 예제였기 때문에 쉬워보일수도 있는데 좀 덩치큰 객체들이 직렬화 될때를 상상해보면 저런 후킹 메서드들을 어떻게 잘 사용할수 있을지 걱정이 된다......

'Java' 카테고리의 다른 글

decompile..  (0) 2015.11.10
ConcurrentModificationException  (0) 2012.11.08
Serializable, 직렬화 (1)  (0) 2012.08.30

우리 수석님께서 예제를 주시며 직렬화 해보라는 미션과 직렬화에 대한 질문을 하셨다......T^T


사실 직렬화를 해본적이 없어서 설명하기가 상당히 난해했다.

교육기관이나 책같은걸 보면 객체 자체를 파일에 쓰고.. 다시 역직렬화해서 읽어오는 예제가 많다.


그래서 직렬화라는게 그게 다인줄 알았다...- -;


사실 난 모르는게 너무 많고 어설픈 개발일을 하고 있다보니 이런 고급 기술을 쓸 기회가 없어서 나중에 진짜 개발자가 되었을때 써먹기 위해 포스팅 해본다..


이런 Person 클래스가 있고, 


이것을 직렬화 하려면 이런식으로 한다.


보통 예제들은 파일에 쓰고 다시 파일을 읽어다가 객체로 만드는데 여기선 그냥 잠깐 Byte배열로 저장했다가 다시 그 바이트를 읽어다가 객체로 만들었다.

암튼, 이게 일반적으로 알고있는 직렬화 라는거였다. (이건 나도 해봤어!)

물론, TestCase도 통과했다.


다음으로 Person객체에 몇가지 메서드를 정의해본다.


다시 테스트 실행을 해보면,

두둥!! 방금 Person객체에 정의한 메서드들이 위와 같은 순서로 실행됬다. 물론 테스트는 실패했을꺼다~

정확한 설명은 어렵지만 직렬화를 할때 JVM이 저런 메서드를 잡아서(?) 실행하는것 같다.......

후킹 메서드라 해야할까.. (용어 지식도 딸림....)


아무튼 이중에 writeObjectreadObject를 사용해서 테스트를 통과시키려면... 자알~ 구현을 해야한다..


이런식으로 구현할수 있고, 사실 위 예제는 불필요하게 구현을 하지 않아도 되잖아?!

좀 더 복잡한 객체, 혹은 어떠한 제약조건이 있을시에 언젠가 분명 사용할 날이 올것이다.


다음편....

'Java' 카테고리의 다른 글

decompile..  (0) 2015.11.10
ConcurrentModificationException  (0) 2012.11.08
Serializable, 직렬화 (2)  (0) 2012.08.30

+ Recent posts