본문 바로가기

JAVA

JAVA 객체 직렬화, ObjectOutputStream 그리고 implements Serializable

직렬화란 무엇이고 왜 쓰는가?

자바 코드 내부에서 사용되는 객체나 데이터를 외부에서도 사용할 수 있도록 하려면 직렬화가 필요하다. 직렬화가 되어야 파일에 읽고 쓸 수 있는 클래스가 된다. 내가 갖고 있는 메모리에서만 데이터를 사용하는 것이 아니라, DB에 저장하거나 파일로 전송하는 등 stream을 통해서 데이터를 보내게 된다. 이때 stream 단위가 byte 단위이다.

즉, 객체를 ----> byte 형태로 데이터를 변환하는 기술을 직렬화 라고 얘기한다. 반대로 byte 형태의 데이터를 받아와서 ----> 다시 객체로 전환하는 것을 역직렬화 라고 부른다.

직렬화 하기 전, 조건

일단 직렬화를 사용하기 전에 조건이 있다. 자바 기본형 타입(primitive) 또는 java.io.Serializable 를 상속받은 객체여야 한다.

다음처럼 일반 클래스인데도 implements Serializable 상속받으면 직렬화 조건이 성립된다. 이때, 클래스의 필드도 직렬화가 가능해야 한다. email, name, birthYear은 기본형 타입(primitive)이기 때문에 직렬화가 가능하다.

import java.io.Serializable;

public class User implements Serializable {
    private String email;
    private String name;
    private int birthYear;
}

ObjectOutputStream 클래스로 직렬화 사용하기

ObjectOutputStream는 객체를 사용할 때 쓰는 클래스이다. 이 클래스로 객체를 넣어줄 것인데, 파일을 생성해서 그 파일 객체를 ObjectOutputStream을 이용해서 객체를 쓸 것이다.

FileOutputStream fos = new FileOutputStream("/tmp/user.dat");
ObjectOutputStream out = new ObjectOutputStream(fos);

 

/tmp/user.dat는 객체를 저장할 파일명인데, FileNotFoundException 예외가 발생할 수도 있다. 일일이 예외처리 할 수 없으므로 바로 메인함수에서 thorws 던져서 처리한다.

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectOutputExam {
    public static void main(String[] args) throws Exception{

        FileOutputStream fos = new FileOutputStream("/tmp/user.dat");
        ObjectOutputStream out = new ObjectOutputStream(fos);

    }
}

writeObject() 객체 쓰는 메소드

이제 /tmp/user.dat 이 파일에 써줄 객체를 정의 해준다.(User user = new User())

그 다음, 객체를 쓰는 메소드인 writeObject()user 객체를 전달해주면 된다.

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectOutputExam {
    public static void main(String[] args) throws Exception{
        User user = new User("hong@hanmail.net", "Hong", 1992);

        FileOutputStream fos = new FileOutputStream("/tmp/user.dat");
        ObjectOutputStream out = new ObjectOutputStream(fos);

        out.writeObject(user);
        out.close();
    }
}

 

참고

직렬화의 개념과 객체 파일로 저장하기 예제

자바 직렬화, 그것이 알고싶다.

JAVA 직렬화란 | 사용 이유