1. 직렬화와 역직렬화
1. 직렬화와 역직렬화
1) 직렬화(Serialization)
직렬화는 자바 시스템 내에서 사용하는 객체나 데이터를 자바 시스템외에서도 사용할 수 있도록 Byte 형태로 변환하는 기술이다. 인스턴스 내용 -> 연속 스트림으로 만들어 파일에 쓰거나 네트워크로 전송이 가능하게 한다.
2) 역직렬화(Deserialization)
역직렬화는 Byte로 변환된 데이터를 다시 자바의 객체로 변환하는 기술이다.
<보조 스트림>
생성자 | 매개변수 | 설명 | |
역직렬화 | ObjectInputStream(InputStream in) | InputStream | ObjectInputStream 생성 |
직렬화 | ObjectOutputStream(OutputStream out) | OutputStream | ObjectOutputStream 생성 |
● writeObject()
ObjectOutputStream 의 writeObject() 메서드는 객체를 직렬화하여 출력 스트림으로 보낸다.
● readObject()
ObjectInputStream 의 readObject() 메서드는 입력 스트림에서 읽은 바이트를 역직렬화하여 객체를 복원한 뒤 리턴한다. 단, 리턴 타입이 Object 이므로 원래 타입으로 다시 형 변환시켜야 한다.
역직렬화를 할 때는 클래스 정보가 존재하지 않을 수 있으므로 ClassNotFoundException 처리도 해야한다.
2. Serializable 인터페이스
직렬화는 인스턴스 내용이 외부로 유출되는 것이므로 프로그래머가 직렬화를 하겠다는 것을 표시해야 한다. 따라서, 직렬화할 인스턴스 객체의 클래스에 Serializable 인터페이스를 implements 를 해야한다.
class Person implements Serializable {
...
String name;
String job;
...
}
3. transient 예약어
Serializble 인터페이스를 implements 한 직렬화 대상 클래스는 모든 인스턴스 변수가 직렬화되고 복원된다.
직렬화하고 싶지 않은 인스턴스 변수가 있다면, 인스턴스 변수 앞에 transient 예약어를 사용한다.
transient 예약어를 사용한 인스턴스 변수는 직렬화, 복원에서 제외되고 그 자료형의 기본 값으로 저장된다.
(객체 자료형인 경우, null 으로 저장됨)
4. SeralVersionUID 를 사용한 버전 관리
객체를 역직렬화 할 때, 직렬화할 때의 클래스와 상태가 다르면 오류가 발생한다.
따라서 직렬화 할 때 자동으로 serialVersionUID를 생성하여 정보를 저장하고
역직렬화할 때 serialVersionUID 를 비교하여 객체를 불러온다.
4. Externalizable 인터페이스
Serializable 인터페이스는 자료를 읽고 쓰는데 transient 예약어를 사용해 제외시키 정도만 가능하다. Serialiable 인터페이스를 확장하여 직렬화, 역직렬화에 대해 좀 더 세부적인 작업이 필요할 때 Externalizable 인터페이스를 구현한다. 즉, 읽고 쓰는 내용은 프로그래머가 직접 구현해야한다.
Externalizable 인터페이스를 구현하려면 writeExternal(), readExternal() 2가지 메서드를 재정의해야 한다.
class Dog implements Externalizable{
String name;
public Dog() {}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(name);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name =in.readUTF();
}
public String toString() {
return name;
}
}
● writeExternal()
Externalizable 인터페이스의 wirteExternal() 메서드는 직렬화(출력)을 위한 메서드다.
● readExteranl()
Externalizable 인터페이스의 readExternal() 메서드는 역직렬화(입력)을 위한 메서드다.
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 15-7. 그 외 입출력 클래스 (0) | 2022.05.12 |
---|---|
[JAVA] 15-5. 보조 스트림 (0) | 2022.05.12 |
[JAVA] 15-4. 문자 단위 스트림 (0) | 2022.05.11 |
[JAVA] 15-3. 바이트 단위 스트림 (0) | 2022.05.11 |
[JAVA] 15-2. 자바 입출력_표준 입출력 (0) | 2022.05.11 |