Java에는 Serializable이 있어서, 다른 thread나 다른 processor, 혹은 다른 machine에 object instance의 상태를 그대로 복사할 수 있다.

물론 다 되는 건 아니고, 당연하지만 다른 object reference를 옮길 수는 없고, 주로 data class의 내용을 쉽게 옮기는 데 사용한다.

 

그래서 Serializable을 쓴 code에 이걸 왜 썼냐고 물어봤더니, 대답은 "쓰기 쉽고 간편해서"라고 한다.

하지만 Serializable은 reflection을 사용해서 전송한다.

 

reflection을 사용하게 되면 보통 나오는 문제는 당연히 속도 저하.

뭐 이거야 짧게 쓰면 큰 문제가 안되는 경우도 있으니..

 

그리고 두 번째는 난독화에 걸리면, 각 field 이름이 제멋대로 변한다.

이 경우는 같은 binary를 사용한다는 전제하에, 바뀐 이름을 공유하게 될테니 넘어갈 수도 있고..

 

Android의 경우는 Parcelable이 있어서, Serializable과 거의 같은 용도로 사용할 수 있다.

대신, Parcelable의 구현에는 reflection을 사용하지 않는다.

 

Serializable의 경우도, writeObject(), readObject()를 직접 구현하면 적은 overhead로 동일한 동작을 할 수 있고, 별도의 추가 처리도 직접 넣을 수 있다.

대신 약간의 bytecode가 더 늘어나지만, 가능하면 Serializable을 사용할 때는 writeObject(), readObject()등을 함께 구현하는 습관을 들이는 걸 추천.

 



Trackbacks  | Comments