[Java] 자바 I/O 에 대한 이해 (3)


바로가기 >> [Java] 자바 I/O 에 대한 이해 (1)

바로가기 >> [Java] 자바 I/O 에 대한 이해 (2)

♦ 객체 직렬화(Object Serialization)
일반적으로 메모리에 생성된 객체의 인스턴스는 비영속성을 갖는다.

파일이나 데이터베이스에 저장된 데이터처럼 영속성을 가지기 위해서 객체 직렬화 기능이 제공된다.

객체 직렬화를 적용하면 생성된 인스턴스 정보를 파일이나 네트워크를 통해서 영속성을 유지할 수 있다.

객체 직렬화 명시 방법

public class 클래스명 implements Serializable{}


Serializable 인터페이스를 구현한 클래스는 객체직렬화가 가능한 클래스이며, 이것은 클래스의 인스턴스 변수에 저장된 데이터를 파일이나 네트워크로 전송할 수 있다는 것을 의미한다.

대부분의 API 는 모두 직렬화가 가능한 클래스들이다. 이것은 Serializable 인터페이스를 구현했다는 것을 의미한다.

객체 직렬화를 위해서는 다음 2가지 I/O 클래스를 사용한다.
ObjectInputStream – 직렬화된 데이터를 읽을 때 사용한다. 역직렬화.
ObjectOutputStream – 인스턴스를 객체 직렬화로 출력한때 사용한다.

객체 직렬화의 특징
Serializable 인터페이스를 사용한다.
메모리에 생성된 인스턴스를 내부적으로 byte 로 처리한다.
byte 단위로 처리되기 때문에 ObjectInputStream 과 ObjectOutputStream 을 사용한다.
연쇄적인 성질을 가진다. 직렬화되는 인스턴스 변수가 참조하는 객체까지도 연쇄적으로 객체 직렬화된다.
객체 직렬화에서 제외시키려면 transient 키워드를 명시하면 된다.

직렬화에 사용될 Person 클래스

import java.io.Serializable;

public class Person implements Serializable {
	
	private static final long serialVersionUID = 1L;
	String name;
	int age;

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}

 

Person 클래스 직렬화

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Test10 {

	public static void main(String[] args) {
		try {
			Person p = new Person("정대만", 23);
			File f = new File("D:\\fileTest", "serial.dat");
			FileOutputStream fos = new FileOutputStream(f);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(p);
			oos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

역직렬화

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Test11 {

	public static void main(String[] args) {
		try {
			File f = new File("D:\\fileTest", "serial.dat");
			FileInputStream fis = new FileInputStream(f);
			ObjectInputStream ois = new ObjectInputStream(fis);
			Person p = (Person) ois.readObject();
			System.out.println(p.getName() + " " + p.getAge());
			ois.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

 

답글 남기기