직렬화란 무엇이고 왜 쓰는가?
자바 코드 내부에서 사용되는 객체나 데이터를 외부에서도 사용할 수 있도록 하려면 직렬화가 필요하다. 직렬화가 되어야 파일에 읽고 쓸 수 있는 클래스가 된다. 내가 갖고 있는 메모리에서만 데이터를 사용하는 것이 아니라, 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' 카테고리의 다른 글
자바 무슨말인지 모르겠는 제네릭(Generics) 메서드 (0) | 2023.11.04 |
---|---|
자바 메서드 매개변수에 객체 넣어서 전달하기 (0) | 2023.11.04 |