본문 바로가기

이론/알고리즘&자료구조&Java

[Java] 자바의 직렬화란?(Serializable)

자바 직렬화(Serialize)


직렬화(Serialize)

자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 변환하는 기술

역직렬화 - byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술

  • 직렬화 대상 클래스를 Serizalizable 인터페이스를 구현하여 정의

  • 직렬화하지 않을 속성(ex-보안키)은 transient 예약어를 통해 처리 가능



직렬화 대상인 User 클래스 정의

class User implements Serializable{
private String name;
private transient String password; // 패스워드는 보안상 문제로 직렬화하지 않음
public int age;

public User(String name,String password, int age) {
this.name=name;
this.password=password;
this.age=age;
}

public String toString() {
return "("+name+", "+password+", "+age+")";
}

}



직렬화 메소드 정의

ObjectOutputStream이 객체를 직렬화하는 핵심 클래스이다.

    public static void doSerializable() {
try {
 FileOutputStream fos = new FileOutputStream("user");
 ObjectOutputStream oos = new ObjectOutputStream(fos);
 
 User user=new User("name","1234",20);
 
 oos.writeObject(user);//usr 객체 직렬화
 System.out.println("직렬화 수행!");
 oos.close();
}catch(Exception ex)
{
ex.printStackTrace();
}
}



역직렬화 메소드 정의

    public static Object undoSerializable() throws IOException, ClassNotFoundException{

FileInputStream fis = new FileInputStream("user");
ObjectInputStream in=new ObjectInputStream(fis);

User user=(User)in.readObject();//객체 역직렬화

System.out.println(user.toString());//출력
in.close();
return user;

}



Main.java

public static void main(String[] args) throws ClassNotFoundException, IOException {

doSerializable();
undoSerializable();
   
}



Result

직렬화 수행!
(name, null, 20)

두 번째 줄의 출력을 통해 password를 제외한 primitive type 속성이 정상적으로 직렬화-역직렬화 된 것을 확인할 수 있다.


다른 시스템 간의 직렬화를 위해서는 SerialVersionUID 라는 버전을 관리하는 상수를 클래스에 정의해서 개발자가 직접 관리해야한다. 시스템 간 클래스에 약간의 차이가 있을 수 있는데, 그 차이에도 불구하고 역직렬화해서 담아오고 싶다면! 말이 어려우니 다음에 예제로 작성해봐야겠다