티스토리 뷰

프로그래밍/java

Java - 직렬화(Serialization)

박스여우 2016. 11. 23. 16:55

직렬화 - Serialization

여러 프로젝트를 진행하다보면 가끔씩 객체를 파일로 저장하거나 네트워크를 통해 전송하고 싶은 경우가 있습니다. 이럴경우 객체를 JSON으로 일일이 바꿔서 전송했는데요, 이처럼 불편한 방식을 사용하지 않고 정말 깔끔하게 객체그 자체를 저장하거나 전송할 수 있는 방법이 있습니다.


짐작하셨다싶이 그 방법은 바러 직렬화(Serialization)인데요, 이번 포스팅은 이 직렬화에 대해 알아보고 예제를 통해 사용 방법을 알아보도록 하겠습니다.



직렬화란?

직렬화라는 단어에는 무언가 일자로 늘어놓는것이 연상되는데요, 실제로 직렬화라는 개념은 이와 비슷합니다. 직렬화는 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것 입니다. 다시말해 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해 송수신이 가능하게 하는 것 입니다.


우선 직렬화를 하여 객체를 저장하기 전에 짚고 넘어가야 할 것이 있습니다. 사실상 객체에는 메소드가 포함되지 않습니다. 하나의 클래스에는 여러 객체가 있고, 각각의 객체마다 다른 멤버변수들을 가지고 있습니다. 하지만 메소드의 경우 모두가 공통적이기 때문에 객체를 저장할때는 메소드를 제외하고 순수하게 값들만 저장하게 됩니다.


또한 객체 내부에는 기본형 멤버변수가 있을수도 있고, 다른 객체나 배열과 같이 참조형 멤버변수가 있을 수도 있습니다. 하지만 참조형 멤버변수를 가지고 있을 경우에는 직렬화 과정이 더욱 복잡해 지는데요, 저희는 이러한 과정을 모두 알 필요는 없습니다. Java에서는 직렬화를 자동으로 수행해 주는 ObjectInputStream, ObjectOutputStream을 제공해 주기 때문이죠!



Do It Serialization!

우선 객체를 직렬화 하기 위해서는 Serializable 인터페이스를 구현해야 합니다. 다만 Serializable 인터페이스는 구현해야할 메소드가 없기 때문에 implements 선언만 해 주시면 됩니다. Serializable 인터페이스를 사용하는 이유는 해당 객체에게 직렬화가 제공되어야 함을 JVM을 알려주어야 하기 때문입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
 
public class main {
 
    public static void main(String args[]) {
        TestObject tObj = new TestObject(123"asd");
        File file = new File("test");
        try{
        FileOutputStream fout = new FileOutputStream(file);
        ObjectOutputStream oout = new ObjectOutputStream(fout);
        oout.writeObject(tObj);
        }catch(IOException e){}
    }
}
 
 
 
import java.io.Serializable;
 
public class TestObject implements Serializable{
    private int a;
    private String b;
    public TestObject(int a, String b){
        this.a = a;
        this.b = b;
    }
 
}
cs

위의 예제는 객체를 직렬화 하여 파일로 저장하는 예제 입니다. 실질적으로 객체를 직렬화 하기 위해서는 ObjectOutputStream을 사용하게 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
 
public class main {
 
    public static void main(String args[]){
        TestObject tObj;
        File file = new File("test");
        try{
            FileInputStream fin = new FileInputStream(file);
            ObjectInputStream oin = new ObjectInputStream(fin);
            tObj = (TestObject)oin.readObject();
        }catch(IOException | ClassNotFoundException e){}
    }
}
cs

다음으로 저장된 객체 파일로 부터 역직렬화를 하여 객체를 가져오는 예제 입니다. 직렬화 비슷하게 역직렬화를 하기 위해 ObjectInputStream을 사용합니다.


사실 Serializable 인터페이스를 implements 해주지 않아도 정상 작동하는것 같았습니다만, 그래도 안정적인 작동을 위해 해 주어야 하는것이 좋을것 같습니다. 마지막으로 직렬화를 원하지 않는 멤버변수가 있다면 접근제한자와 같이 transient이라는 키워드를 적어주시면 됩니다. 하지만 사실상 transient가 붙은 인스턴스변수는 직렬화가 되지 않는것이 아니라 해당 타입의 기본값으로 직렬화 된다고 볼 수 있습니다.



 마무리

이번 포스팅을 통해 살펴본 직렬화라는 개념 역시 기존에 프로젝트를 진행하면서 몇번 다뤄보고 이해는 하고 있던 내용이였다. 하지만 이렇게 다시 블로그에 정리함으로써 개념이 확립되고 좀더 자세하고 세세한 부분을 공부할 수 있었다. (직렬화에 대한 질문이 면접때 나왔다는..)

댓글
댓글쓰기 폼
Total
498,440
Today
22
Yesterday
452
링크
«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함