객체 직렬화가 뭔가요?


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

  • 2016년 01월 29일에 작성됨

조회수 308


1 답변


좋아요
1
싫어요
채택취소하기

직렬화란?

객체의 직렬화는 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해서 스트림(송수신)이 가능하게 하는것을 의미한다. 자바 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
  • 2016년 01월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close