객체 직렬화가 뭔가요?

객체 직렬화가 뭔지 설명좀 해주세요. 예제같은것도 있으면 더 좋구요..

1답변

  • 좋아요

    2

    싫어요
    채택취소하기

    직렬화란?

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

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

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

    직렬화 수행을 위한 파일 저장과 읽기

    ▼ 우선 파일저장을 위해서는 FileOutputStream 클래스가 필요합니다. 파일이 저장될 위치를 인수로 받아서 객체를 생성한뒤 직렬화를 위해 ObjectOutputStream 클래스를 사용하였습니다. 직렬화를 만드는 함수는 writeObject() 입니다. Serializable 인터페이스를 상속받은 User 객체를 인수로 넘깁니다.

    // 마샬링(marshalling) 수행, 직렬화 
    public void doSerializable() throws IOException {
        FileOutputStream fos = new FileOutputStream(filePath);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(user);
        oos.close();
    }
    

    직렬화한 파일을 다시 읽어 들이기 위해 FileInputStream 과 ObjectInputStream 클래스를 사용하였습니다. 읽어들이는 함수는 readObject() 이며 해당 객체로 채스팅을 해 줘야 겠죠.

    // 언마샬링(unmarshalling) 수행, 역직렬화
    public Object undoSerializable() throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filePath);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Object user = ois.readObject();
        ois.close();
    
        return user;
    }
    

    직렬화 전체 소스

    ▼ init() 함수에서 직렬화 객체에 데이터를 셋팅한후 doSerializable() 함수를 이용해서 직렬화하고 파일로 저장합니다. 그리고 다시 undoSerializable() 함수를 이용해서 직렬화를 해제한뒤 콘솔에 그 값을 찍는 내용입니다.

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class Main {
    
        private String filePath;
        private User user;
        public static void main(String[] args){
    
            Main main = new Main();
            try {
                main.init();
                main.doSerializable();
                User user = (User) main.undoSerializable();
    
                System.out.println(user.getName());
                System.out.println(user.getAge());
                System.out.println(user.getPhoneNumber());
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void init() {
    
            filePath = "C:\\user.ser";
    
            user = new User();
            user.setName("kim dong");
            user.setAge(50);
            user.setPhoneNumber("010-9858-9985");
        }
    
        // 마샬링(marshalling) 수행, 직렬화 
        public void doSerializable() throws IOException {
    
            FileOutputStream fos = new FileOutputStream(filePath);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(user);
            oos.close();
        }
    
        // 언마샬링(unmarshalling) 수행, 역직렬화
        public Object undoSerializable() throws IOException, ClassNotFoundException {
    
            FileInputStream fis = new FileInputStream(filePath);
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object user = (User) ois.readObject();
            ois.close();
    
            return user;
        }
    }
    
    // 직렬화 객체 
    class User implements Serializable {
        private static final long serialVersionUID = 2L;
        private String name;
        private int age;
        private String phoneNumber;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getPhoneNumber() {
            return phoneNumber;
        }
        public void setPhoneNumber(String socialNumber) {
            this.phoneNumber = socialNumber;
        }
    }
    
    // 결과
    kim dong
    50
    010-9858-9985
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.