자바/입출력 IO

직렬화(Serializtion): Object 입출력 스트림

백_곰 2022. 4. 29. 10:42

1. 직렬화

- 직렬화(Serializtion)란? 객체를 데이터 스트림으로 만드는 것을 말한다.

 

- 즉, 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것이다.

 

- 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization) 라고 한다.

 

 

 

 

2. ObjectInputStream과 ObjectOutputStream

- 직렬화는 ObjectOutputStream을, 역직렬화는 ObjectInputStream을 사용한다.

 

- ObjectInputStreamObjectOutputStream은 InputStream과 OutputStream을 직접 상속받지만, 

기반 스트림을 필요로 하는 보조 스트림이다.

 

- 그래서 객체를 생성할 때, 기반(주) 스트림을 지정해야 한다. 

 

 

 

- 만약 직렬화(파일에 객체 저장)을 하고싶다면 아래의 예시 코드를 보자.

 

FileOutputStream fos = new FileOutputStream("objectfile.ser");

ObjectOutputStream out = new ObjectOutputStream(fos);

 

out.writeObject(new UserInfo());

 

( 위의 코드를 해석하면, objectfile.ser이라는 파일에 UserInfo 객체를 직렬화하여 저장한다. )

 

 

 

- 반대로, 역직렬화아래의 예시 코드처럼 해야한다. 

 

FileInputStream fis = new FileInputStream("objectfile.ser");

ObjectInputStream in = new ObjectInputStream(fis);

 

UserInfo info = (UserInfo) in.readObject();

 

 

 

- readObject()writeObject() 이외에도 여러가지 타입의 값을 입출력할 수 있는 메서드를 제공한다.

( ex) readDouble, WriteBytes 등 )

 

( defaultReadObject()defaultWriteObject()는 자동 직렬화를 수행한다. )

 

 

- 객체를 직렬화/역직렬화하는 작업은 객체의 모든 인스턴스 변수가 참조하는 모든 객체에 대한 것이기

때문에 상당히 복잡하며 시간도 오래걸리므로, 아래와 같은 메서드 2개를 직접 구현해야 한다.

 

(1) private void writeObject(ObjectOutputStream out) throws IOException{

}

 

(2) private void readObject(ObjectInputStream in) throws IOException{

}

 

 

 

다음장

직렬화가 가능한 클래스 만들기 - Serializable, transient (1) (tistory.com)

 

직렬화가 가능한 클래스 만들기 - Serializable, transient (1)

1. 직렬화가 가능한 클래스를 만드는 방법 - 직렬화하고자 하는 클래스가 java.io.Serializable 인터페이스를 구현하도록 하면 된다. - 그저 아래 코드처럼 따로 구현할 필요없이 implements만 해주면 된

kind-coding.tistory.com