Java/Do It! 자바 프로그래밍

[JAVA] 15-6. 직렬화

HSY_mumu 2022. 5. 12. 13:46
728x90

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() 메서드는 역직렬화(입력)을 위한 메서드다.

 

728x90