본문

[2017.09.22] 14. 왜 Serializable를 사용할까?

개념

Serializable의 목적은 Object를 byte array로 변경하기 위함이다.

그렇다면 왜 Object를 byte array로 변경해야할까?

(출처 - https://stackoverflow.com/questions/2232759/what-is-the-purpose-of-serialization-in-java)


byte array는 클래스의 상태를 나타내고 스트림을 통해 전달이 가능하기 때문이다.

예를 들면, 원본 Object 파일로 저장할 수 없지만 byte array로 변경한 Object는 파일로 저장이 가능하다.

그래서 Object->Byte array->File 저장이 가능하다.


실습

1. Serializable 사용 X, Object 저장 시도

- Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Person {
        private String name;
        private String phoneNum;
 
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getPhoneNum() {
                return phoneNum;
        }
        public void setPhoneNum(String phoneNum) {
                this.phoneNum = phoneNum;
        }       
        
        @Override
        public String toString() {
                return "Name: " + name + ", Phone Number: " + phoneNum;
        }
}
cs


- Serialize.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Serialize {
        public static void main(String[] args) {
                Person heepie = new Person();
                heepie.setName("Heepie");
                heepie.setPhoneNum("010-0000-0000");
                
                try {
                        FileOutputStream fileOut = new FileOutputStream("tmp/person.ser");
                        ObjectOutputStream out = new ObjectOutputStream(fileOut);
                        out.writeObject(heepie);
                        out.close();
                        fileOut.close();
                        System.out.printf("Serialized data is saved in /person.ser");
                     }catch(IOException i) {
                        i.printStackTrace();
                     }
        }
}
cs

※ 참고: *.ser 파일은 Object를 File로 serializable할 때, 자바의 표준 규칙으로 확장자를 .ser로 하고 있다.


1. 결과


2. Serializable 사용 O, Object 저장 시도

- Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Person implements Serializable {
        private String name;
        private String phoneNum;
 
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getPhoneNum() {
                return phoneNum;
        }
        public void setPhoneNum(String phoneNum) {
                this.phoneNum = phoneNum;
        }       
        
        @Override
        public String toString() {
                return "Name: " + name + ", Phone Number: " + phoneNum;
        }
 
}
cs


- Serialize.java

위 코드와 동일



2. 결과


3. 저장된 File 읽어오기

- Deserialize.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Deserialize {
        public static void main(String[] args) {
                Person p = null;
                try {
                        FileInputStream fileIn = new FileInputStream("tmp/person.ser");
                        ObjectInputStream in = new ObjectInputStream(fileIn);
                        p = (Person) in.readObject();
                        in.close();
                        fileIn.close();
                     }catch(IOException i) {
                        i.printStackTrace();
                        return;
                     }catch(ClassNotFoundException c) {
                        System.out.println("Person class not found");
                        c.printStackTrace();
                        return;
                     }
                
                System.out.println(p.toString());
        }
}
cs


3. 결과



#serializable #자바 serializable #자바 직렬화 #자바 객체 전달 #자바 객체 전송 #직렬화 이유

공유

댓글