객체 직렬화(Serialization) & 역직렬화(Deserialization)
- 자바에서 사용하는 객체는 상태(변수 값)가 계속 변하는 영속성을 부여함 이때, 어떤 순간의 상태(변수 값)를 파일 또는 네트워크 등으로 내보내는 것 : 직렬화 파일이나 네트워크로부터 데이터를 읽어 객체로 변환하는 것 : 역직렬화
- 직렬화란 인스턴스 내용을 연속 스트림으로 만드는 것 스트림을 만들어야 파일에 쓸 수도 있고 네트워크로 전송할 수도 있다.
- 직렬화 과정을 통해 인스턴스 변수 값을 스트림으로 만들게 된다.
- ObjectInputStream, ObjectOutputStream 클래스 사용
주의! - 직렬화 대상이 되는 클래스를 정의할 때는 반드시 Serializable 인터페이스 상속 필수!
- 만약, 직렬화 클래스 내에서 출력 대상으로부터 제외시킬 변수가 있을 경우 해당 변수 선언부 앞에 transient 키워드를 사용하면 출력대상에서 제외됨
직렬화 문법
ObjectInputStream(InputStream in)
역직렬화 문법
ObjectOutputStream(OutputStream out)
직렬화를 위한 Person 클래스 정의
주의!
- 직렬화 대상이 되는 클래스를 정의할 때 반드시 Serializable 인터페이스 상속 필수!
- 별도의 추상 메서드가 없는 단순한 마커(Marker) 용도의 인터페이스
Person p = new Person("홍길동", 20,"031010-3123456");
Person p2 = new Person("이순신", 44, "791111-1234567");
class Person implements Serializable {
String name;
int age;
String jumin;
public Person(String name, int age, String jumin) {
super();
this.name = name;
this.age = age;
this.jumin = jumin;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", jumin=" + jumin + "]";
}
}
File f = new File("C://temp/person.txt");
1. 직렬화
Person 객체를 외부 파일로 출력하기
ObjectOutputStream 객체를 생성하여 FileOutputStream 객체 연결
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))) {
oos.writeObject(p);
oos.writeObject(p2);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("객체 출력 완료!");
2. 역직렬화
외부 폴더(C://temp/person.txt)에 저장되어있는 파일내의 Person객체 ObjectInputStream 객체 사용하여 읽어오기
- ObjectInputStream 객체의 readObject() 메서드를 호출하여 파일에 저장된 객체를 Object 타입으로 읽어오기
- 리턴타입이 Object 타입으로 실제 객체 사용을 위해 다운캐스팅 필요
- toString() 메서드가 오버라이딩 되어있으므로 변수명 바로 전달하면 원하는 내용 나옴
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f))) {
// ObjectInputStream 객체의 readObject() 메서드를 호출하여 파일에 저장된 객체를 Object 타입으로 읽어오기
// => 리턴타입이 Object 타입으로 실제 객체 사용을 위해 다운캐스팅 필요
// Person person = (Person)ois.readObject();
Object o = ois.readObject();
if(o instanceof Person) {
Person person = (Person)o; // 다운캐스팅
//toString() 메서드가 오버라이딩 되어있으므로 변수명 바로 전달하면 원하는 내용 나옴
System.out.println(person);
}
Person person2 = (Person)ois.readObject() ;
System.out.println(person2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
콘솔결과:
Person [name=홍길동, age=20, jumin=031010-3123456]
Person [name=이순신, age=44, jumin=791111-1234567]
출력할때 / 가져올때 주민번호를 숨기려면 class를 생성할때 주민번호 데이터타입앞에 transient를 붙여준다.
'JAVA' 카테고리의 다른 글
[JAVA] 정규표현식에 대해 알아보자 (1) | 2023.12.11 |
---|---|
[JAVA] 키보드로부터 입력받은 데이터를 파일에 출력 (1) | 2023.12.07 |
[JAVA] 자바의 기본 데이터 입출력 (0) | 2023.12.07 |
[JAVA] 자바 I/O - 모니터로부터 데이터를 출력하는 방법 2가지 (0) | 2023.12.07 |
[JAVA] 자바 I/O - 키보드로부터 데이터를 입력받아 처리하는 방법 5가지 (1) | 2023.12.05 |