고급자바
직렬화,역직렬화-22.04.01
AIN99
2022. 4. 1. 17:24
728x90
객체 입출력 보조 스트림 예제(직렬화와 역직렬화)
transient => 직렬화가 되지 않을 멤버변수에 지정한다.
(* static 필드도 직렬화가 되지 않는다.)
직렬화가 되지 않는 멤버변수는 기본값으로 저장된다.
(참조형 변수: null, 숫자형 변수:0)
public class T15_ObjectStreamTest {
public static void main(String[] args) {
// Member 인스턴스 생성
Member mem1=new Member("홍길동", 20, "대전");
Member mem2=new Member("일지매", 30, "경기");
Member mem3=new Member("이몽룡", 40, "강원");
Member mem4=new Member("성춘향", 20, "광주");
ObjectOutputStream oos=null;
try {
//객체를 파일에 저장하기
//출력용 스트림 객체 생성
oos=new ObjectOutputStream(new FileOutputStream("d:/D_Other/memObj.bin"));
//쓰기 작업
oos.writeObject(mem1); //직렬화
oos.writeObject(mem2); //직렬화
oos.writeObject(mem3); //직렬화
oos.writeObject(mem4); //직렬화
System.out.println("쓰기 작업 완료...");
}catch(IOException ex) {
ex.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
<MemberVO만들기>
transient => 직렬화가 되지 않을 멤버변수에 지정한다.
(* static 필드도 직렬화가 되지 않는다.)
직렬화가 되지 않는 멤버변수는 기본값으로 저장된다.
(참조형 변수: null, 숫자형 변수:0)
더보기
transient
직렬화 않시키고싶을 상황: 민감한 정보(비번,주민번호), 불필요한 정보에 붙인다.
private String name;
private transient int age;
private String addr;
바꿔보면
class Member implements Serializable{ //자바는 Serializable인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한하고 있음.
/*
transient => 직렬화가 되지 않을 멤버변수에 지정한다.
(* static 필드도 직렬화가 되지 않는다.)
직렬화가 되지 않는 멤버변수는 기본값으로 저장된다.
(참조형 변수: null, 숫자형 변수:0)
*/
private String name;
private int age;
private String addr;
public Member(String name, int age, String addr) {
super();
this.name = name;
this.age = age;
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
더보기
자바는 Serializable인터페이스를 구현한 클래스만 직렬화 할 수 있도록 제한하고 있음.
class Member implements Serializable
Serializable는 추상메서드가 없다. 표식인터페이스
Member는 이제 Serializable 타입이됨.
그래서 Serializable mem4=new Member("성춘향", 20, "광주"); 가능
<저장한 객체를 읽어와 출력하기>
ObjectInputStream ois=null;
try {
//객체를 읽기위한 스트림 객체 생성
ois=new ObjectInputStream(new FileInputStream("d:/D_Other/memObj.bin"));
Object obj =null;
while((obj=ois.readObject())!=null) {
// 읽어온 데이터를 원래의 객체형으로 변환 후 사용한다.
Member mem=(Member)obj;
System.out.println("이름: "+mem.getName());
System.out.println("나이: "+mem.getAge());
System.out.println("주소: "+mem.getAddr());
System.out.println("-------------------------");
}
}catch(IOException ex) {
ex.printStackTrace();
}catch(ClassNotFoundException ex){
ex.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
->파일을 읽다가 파일 맨끝에 읽어올게 없어서 예외 발생 (항상날 수 밖에...)
그래서 좀 수정...
}catch(IOException ex) {
// ex.printStackTrace();
//더 이상 읽어올 객체가 존재하지 않을 때 예외 발생함.
System.out.println("출력 작업 끝...");
}catch(ClassNotFoundException ex){
ex.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
+기능 더 추가
<객체 파일에 저장하기>
//출력용 스트림 객체 생성
//기반스트림을감싸주면 된다.
oos=new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("d:/D_Other/memObj.bin")));
<저장한 객체 읽어올때>
//객체를 읽기위한 스트림 객체 생성
ois=new ObjectInputStream(
new BufferedInputStream(
new FileInputStream("d:/D_Other/memObj.bin")));
=>결과 동일~
728x90