Network/Data communication

직렬화(Serialization)에 대해

범데이 2022. 6. 17. 01:20

1. 직렬화(Serialization)란 무엇인가?

객체의 직렬화(Serialization)는 객체의 내용을 Byte 단위로 변환하여 파일 또는 네크워크를 통해서 스트림(송수신)이 가능하도록 하는 것을 의미한다.

 

반대로 Byte로 변환된 데이터를 다시 객체가 저장되었던 상태로 재 변환하는 기술을 역직렬화(Deserialization)라고 한다.

출처: https://www.geeksforgeeks.org/serialization-in-java/

 

[객체 전송의 단계]

  • 직렬화된 객체를 바이트 단위로 분해한다. (이를 Marshalling이라고도 한다.)
  • 직렬화 되어 분해된 데이터를 순서에 따라 전송한다.
  • 전송 받은 데이터를 원래대로 복구한다. (이를 Unmarshalling이라고도 한다.)

 

 

 

2. 직렬화 & 역직렬화를 하는 이유?

자바의 I/O 처리는 정수, 문자열 바이트 단위의 처리만 지원했었다. 따라서 복잡한 내용을 저장/복원 하거나, 네트워크로 전송하기 위해서는 객체의 멤버변수의 각 내용을 일정한 형식으로 만들어(이것을 패킷이라고 한다) 전송해야 했다.

 

객체 직렬화는 객체의 내용(구체적으로는 멤버변수의 내용)을 자바 I/O가 자동적으로 바이트 단위로 변환하여, 저장/복원 하거나 네트워크로 전송할 수 있도록 기능을 제공해 준다.

즉 개발자 입장에서는 객체가 아무리 복잡하더라도, 객체 직렬화를 이용하면 객체의 내용을 자바 I/O가 자동으로 바이트 단위로 변환하여 저장이나 전송을 해주게 된다.

 

자바에서 직렬화는 자동으로 처리해주는 것이기 때문에, 운영체제가 달라도 전혀 문제되지 않는다. 객체를 직렬화할때 객체의 맴버변수가 다른 객체(Serializable 인터페이스를 구현한)의 레퍼런스 변수인 경우에는 레퍼런스 변수가 가리키는 해당 객체까지도 같이 객체 직렬화를 해버린다

 

 

 

3. SerialVersionUID라는 개념은 무엇인가?

직렬화하면 내부에서 자동으로 SerialVersionUID라는 고유의 번호를 생성하여 관리한다. 이 UID는 직렬화와 역직렬화 할 때 중요한 역할을 한다. 이 값이 맞는지 확인 후 처리하기 때문이다. 만약 이 SerialVersionUID 값이 맞지 않는다면 오류를 출력한다.

 

객체 생성 당시의 UID와 현재 변경한 이후의 UID는 내부에서 자동으로 생성되어 관리되므로 UID가 달라 오류가 발생할 수 있다. 이러한 문제로 Java에서는 SerialVersionUID를 직접 선언하고 관리하는 방식을 적극 권장하고 있다.

 

 

 

 


#References

https://weicomes.tistory.com/63

https://zakelstorm.tistory.com/82

https://medium.com/@lunay0ung/basics-직렬화-serialization-란-feat-java-2f3eb11e9a8

반응형