자바의 직렬화란, java 내부 시스템에서 사용되는 객체나 데이터를 외부에서 사용할 수 있도록 byte형태로 변환하는 것입니다.
역직렬화란 byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술로,직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 적재시킵니다.
생성된 바이트는 플랫폼에 독립적이기 때문에 어디에서나 쓰일 수 있으며 한 플랫폼에서 직렬화된 객체는 다른 플랫폼에서 역직렬화를 통해 데이터를 받아올 수 있습니다.
직렬화는 생성한 클래스를 java.io.Serializable 인터페이스를 구현하는 클래스로 만들어야 그 조건이 성립됩니다. Serializable 인터페이스는 메소드도 필드도 없는 마킹 역할을 하는 인터페이스입니다.
public class Tako implemest Serializable{
...
}
다른 객체를 멤버 변수로 사용할 경우, 그 객체 클래스들 중 Serializable 인터페이스를 구현한 클래스가 하나라도 없으면 직렬화할 수 없습니다.
객체를 IO하기 위해서는 ObjectInputStream과 ObjectOutputStream을 주로 사용합니다.
스트림에 객체를 출력하는 직렬화를 진행할때는, ObjectOutputStream을 사용하고
FileOutputStream fot = new FileOutputStream(filePath);
ObjectOutputStream out = new ObjectOutputStream(fot);
out.writeObject(human);
out.close();
스트림으로부터 객체를 입력하는 역직렬화시 ObjectInputStream을 사용합니다.
FileInputStream fi = new FileInputStream(filePath);
ObjectInputStream ois = new ObjectInputStream(fi);
Object user = ois.readObject();
ois.close();
return user;
직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 동일한 클래스를 사용해야합니다. 다만 클래스의 이름이 같더라도 클래스 내용이 변경되었으면 역직렬화에 성공하지 못하게 됩니다. 이를 방지하기 위해 serialVersionUid라는 변수를 사용하면 되는데, 이 변수는 클래스가 변경되더라도 같은 클래스임을 보장해주는 역할을 합니다. 다만 직렬화 혹은 역직렬환된 클래스에서 serialVersionUID를 명시적으로 지정하지 않는다면, Compiler가 계산한 값을 부여하며 class에 변경이 있으면 serialVersionUID값이 바뀌게 됩니다.
'Language > Java' 카테고리의 다른 글
객체지향 프로그래밍2 (0) | 2021.12.05 |
---|---|
완독 스터디 - 객체지향 프로그래밍1 (0) | 2021.11.28 |
Java Checked Excpetion, UnChecked Exception (0) | 2021.09.26 |
자바 - 동일성과 동등성(equals, == ) (0) | 2021.09.11 |
SOLID 원칙 (0) | 2021.09.03 |