소개
자바 직렬화와 역직렬화는 자바 객체를 스트림 방식으로 이동하거나 저장하는 작업을 말합니다. 자바에서는 Serializable 인터페이스와 ObjectOutputStream을 사용하여 이를 구현할 수 있습니다. 이 글에서는 Serializable 인터페이스와 ObjectOutputStream 클래스를 자세히 소개하고, 이들을 사용하여 자바 객체를 어떻게 직렬화하고 역직렬화하는지 알아보겠습니다.
(위 사진은 내용과 무관함 Pexels 제공 사진)
상세설명
1. 자바 직렬화: Serializable 인터페이스
자바 직렬화는 메모리 내 객체를 스트림 형태로 변환하는 기술입니다. 자바에서 이 기능을 사용하려면 Serializable 인터페이스를 구현해야 합니다. Serializable 인터페이스는 특정 클래스가 직렬화를 지원하는지 여부를 확인하는 데 사용됩니다. 이 인터페이스는 메소드가 없고, 이 인터페이스를 구현한 클래스 객체는 자바의 ObjectOutputStream 클래스를 통해 직렬화될 수 있다는 것을 의미합니다.
2. ObjectOutputStream 이해하기
ObjectOutputStream은 객체를 직렬화하여 일반적인 스트림 형태로 출력하기 위한 스트림 클래스이다. 이는 데이터를 스트림 형태로 전송하거나 파일에 저장할 수 있는 형태로 변환하기 위하여 사용된다. 객체를 스트림으로 쓰기 전에는 반드시 Serializable 인터페이스를 구현해주어야 한다. 이 때, 객체는 ObjectOutputStream 객체를 이용하여 스트림에 쓰기 작업을 할 수 있다. 해당 객체를 쓰는 작업은 writeObject() 메소드를 사용하여 수행한다. 또한, 객체를 스트림의 끝에 쓰기 작업이 끝났음을 알리기 위해 flush() 메소드를 사용하여 스트림을 비울 수 있다.
3. 역직렬화 이해하기
자바 역직렬화는 객체를 기록해 놓은 자바 바이트 스트림(.ser 파일)을 읽어서 객체를 복원하는 작업이다. 역직렬화는 바이트 스트림으로부터 객체를 읽고 복원하기 위해 사용되는 ObjectInputStream 인터페이스를 사용하며, 객체를 역직렬화하기 전에는 객체가 직렬화되었음을 표시하기 위해 Serializable 인터페이스를 구현해야 한다. 또한 역직렬화 시 한 객체를 다른 객체로 변환하는 방법도 있으며, 이 경우 readObject() 메소드를 사용한다.
4. 자바 직렬화 하기
자바 직렬화는 데이터와 객체를 저장하거나 네트워크를 통해 데이터 전송을 할 때 사용할 수 있는 기술입니다. 자바 직렬화는 Serializable 인터페이스를 구현하는 클래스의 인스턴스를 이용하여 직렬화할 수 있습니다. 그리고 이를 직렬화하기 위해서는 ObjectOutputStream 클래스를 이용하여 직렬화할 수 있습니다. ObjectOutputStream을 이용하면 객체를 연결된 스트림에 입력할 수 있고, 이를 이용하여 데이터를 저장하거나 네트워크를 통해 데이터를 전송할 수 있습니다.
5. 역직렬화 하기
역직렬화는 자바 객체를 직렬화된 바이트 배열로 변환하고, 이 바이트 배열을 자바 객체로 다시 변환하는 과정이다. 이를 위해 ObjectInputStream과 readObject() 메서드를 사용한다. 이 메서드는 직렬화된 바이트 배열을 읽고 객체화하여 반환하기 때문에, 역직렬화를 수행할 때 사용된다. 역직렬화를 수행하기 위해서는 반드시 직렬화에서 사용된 동일한 클래스를 임포트해야 하며, 변경된 클래스는 역직렬화가 불가능하다.
(위 사진은 내용과 무관함 Pexels 제공 사진)
종합
자바 직렬화란 객체의 메모리 내용을 일련의 바이트로 변환하는 과정을 말한다. 이는 메모리를 다른 곳으로 보내거나 파일로 저장하거나, 실행 중인 프로그램의 메모리 내용을 기록하기 위한 데이터 전송 방법으로 사용한다.
자바 역직렬화는 직렬화된 바이트를 객체로 복구하는 과정이다. 이를 수행하기 위해서는 Serializable 인터페이스와 ObjectOutputStream이 필요하다. Serializable 인터페이스는 객체의 멤버 변수를 직렬화하기 위한 마커 인터페이스이고, ObjectOutputStream은 객체의 멤버 변수를 직렬화하거나 역직렬화하기 위한 스트림 클래스이다.
객체를 직렬화하고 역직렬화 하기 위해서는 Serializable 인터페이스를 구현하고, ObjectOutputStream을 사용해야 한다. 이를 통해 객체를 메모리에 저장하거나 다른 곳으로 보내거나 파일로 저장하는 데이터 전송 방법을 제공한다.
함께 보면 좋은 영상
C# TCP – 4 / 송수신 데이터 직렬화, 역직렬화