Java ObjectInputStream 완전 정복: 역직렬화 실전 가이드
Java ObjectInputStream 클래스
ObjectInputStream으로 Java에서 직렬화된 객체를 읽는 방법을 단계별 예제와 실용적 팁으로 알아봅니다.
java.io 패키지의 ObjectInputStream 클래스는 ObjectOutputStream으로 이전에 작성된 객체를 역직렬화할 수 있게 합니다. 추상 InputStream 클래스를 확장합니다.
ObjectInputStream 작동 원리
직렬화는 Java 객체를 저장하거나 전송할 수 있는 바이트 스트림으로 변환합니다. 역직렬화(역과정)는 ObjectInputStream이 처리하며, 바이트 스트림을 읽어 원래 객체를 재구성합니다.
ObjectInputStream 생성하기
ObjectInputStream을 생성하려면 먼저 클래스를 임포트하고 일반적으로 FileInputStream인 소스에 연결합니다:
// 파일에 연결
FileInputStream fileStream = new FileInputStream("example.dat");
// ObjectInputStream으로 래핑
ObjectInputStream objStream = new ObjectInputStream(fileStream);
인스턴스화되면 objStream은 파일에서 직렬화된 객체를 읽을 수 있습니다.
ObjectInputStream의 핵심 메서드
가장 자주 사용되는 메서드들입니다:
read() - 단일 바이트를 읽습니다.
readBoolean() - 불리언 값을 읽습니다.
readChar() - 문자를 읽습니다.
readInt() - 정수를 읽습니다.
readObject() - 스트림에서 객체를 재구성합니다.
예제 1: 기본 역직렬화
아래는 정수와 문자열을 파일에 쓴 다음 다시 읽는 최소 예제입니다.
import java.io.*;
public class Main {
public static void main(String[] args) {
int data1 = 5;
String data2 = "This is programiz";
try {
// 데이터 쓰기
FileOutputStream fos = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(data1);
oos.writeObject(data2);
// 데이터 읽기
FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("Integer data :" + ois.readInt());
System.out.println("String data :" + ois.readObject());
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과
Integer data :5
String data :This is programiz
예제 2: 커스텀 객체 역직렬화
단순 Dog 객체를 직렬화하고 역직렬화합니다. 이 클래스는 작동을 위해 Serializable을 구현해야 합니다.
import java.io.*;
class Dog implements Serializable {
String name;
String breed;
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Tyson", "Labrador");
try {
// 직렬화
FileOutputStream fos = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog);
// 역직렬화
FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog newDog = (Dog) ois.readObject();
System.out.println("Dog Name: " + newDog.name);
System.out.println("Dog Breed: " + newDog.breed);
oos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과
Dog Name: Tyson
Dog Breed: Labrador
핵심 포인트:
- 객체 작성은
ObjectOutputStream을 사용합니다.
- 객체 읽기는
ObjectInputStream을 사용합니다.
Serializable을 구현한 객체만 직렬화할 수 있습니다.
추가 ObjectInputStream 메서드
| 메서드 | 설명 |
available() | 블로킹 없이 읽을 수 있는 바이트 수를 반환합니다. |
mark() | 스트림의 현재 위치를 표시합니다. |
reset() | 스트림을 가장 최근 표시 위치로 재설정합니다. |
skipBytes(int n) | n 바이트를 건너뜁니다. |
close() | 스트림을 닫고 리소스를 해제합니다. |
더 깊은 통찰을 위해 공식 Java 문서를 방문하세요.