[Java] 직렬화(Serialization)

2022. 5. 17. 15:26JAVA/Overview

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

직렬화란 자바의 객체의 상태에서 바이트 스트림으로 변환하는 기술을 말합니다. 비직렬화는 반대로 바이트 스트림에서 다시 자바의 객체로 변환하는 기술입니다. 우리는 이러한 바이트 스트림을 데이터베이스에 저장하거나 네트워크를 통해서 전송할 수 있습니다.

 

2. 직렬화(Serialization)와 비직렬화(Deserialization)

예를 들어 한 플랫폼에서 객체를 직렬화하고 다른 플랫폼에서 역직렬화할 수 있습니다. 직렬화하고자 하는 클래스는 직렬화 가능한 인터페이스를 구현해야합니다. 다음은 Person 클래스를 직렬화하고 역직렬화하여 필드값을 참조하는 예제입니다.

import java.io.Serializable;

public class Person implements Serializable{
    private static final long serialVersionUID = 1L;
    public static String country = "ITALY";
    private int age;
    private String name;
    public transient int height;
    
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	public static String getCountry() {
		return country;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public int getHeight() {
		return height;
	}
	public static void setCountry(String country) {
		Person.country = country;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setHeight(int height) {
		this.height = height;
	}
    
    
}
import static org.junit.jupiter.api.Assertions.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.junit.jupiter.api.Test;

class PersonTest {

	@Test
	void whenSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException {
		Person person = new Person();
		person.setAge(20);
		person.setName("Joe");
		
		FileOutputStream fileOutputStream = new FileOutputStream("yourfile.txt");
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
		
		objectOutputStream.writeObject(person);
		objectOutputStream.flush();
		objectOutputStream.close();
		
		FileInputStream fileInputStream = new FileInputStream("yourfile.txt");
		ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
		
		Person p2 = (Person) objectInputStream.readObject();
		objectInputStream.close();
		
		assertTrue(p2.getAge() == person.getAge());
		assertTrue(p2.getName().equals(person.getName()));
	}

}

위 예제에서 person 객체를 직렬화하여 yourfile.txt 파일에 저장하고 다시 yourfile.txt 파일을 읽어서 역직렬화하는 것을 볼 수 있습니다. 위 코드에서 serialVersionUID 정적 멤버는 직렬화/비직렬화할때 식별하기 위한 식별자번호입니다. Person 클래스의 필드 멤버 중에서 height 필드는 transient 제어자가 적용되어 있는데 transient 제어자를 적용하면 해당 멤버는 직렬화 과정에서 제외됩니다.

 

References

Introduction to Java Serialization