5-4. (1)직렬화(Serialize)

zhyun·2020년 9월 28일
0

HighJava

목록 보기
47/67
post-custom-banner

1. 직렬화(Serialize)

  • 객체를 스트림 형식으로 파일에 저장하는 방법
  • 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것
  • 직렬화 조건
    : java.io.Serializable 인터페이스를 상속받은 객체는
    직렬화 할 수 있는 기본 조건
  • 직렬화 방법
    : java.io.ObjectOutputStream을 사용하여 직렬화 진행

Serializable 인터페이스

  • Serializable 인터페이스를 구현한 클래스를 작성하면
    해당클래스의 모든 멤버변수직렬화 대상이 된다.
  • 객체를 스트림을 통해 입출력하기 위해서는 직렬화 과정이 필요하다. 직렬화 대상은 해당 클래스의 모든 멤버변수가 된다.

객체 정의

  • 객체는 클래스에 정의된 인스턴스 변수의 집합
  • 객체에는 클래스 변수나 메서드가 포함되지 않는다

직렬화가 가능한 객체의 조건

  • 기본형타입(boolean,char,byte,short,int,long,float,double)은 직렬화 가능
  • Serializable 인터페이스를 구현한 객체여야 한다
  • Vector클래스는 Serializable 인터페이스 구현

ObjectInputStream & ObjectOutputStream

  • 자바는 객체를 입출력할 수 있는 보조스트림인 ObjectInputStream과 ObjectOutputStream을 제공한다.
  • 연결할 바이트 입출력 스트림을 매개값으로 받는다.
  • ObjectOutputStream
    • 바이트 출력 스트림과 연결되어 객체를 직렬화하는 역할
    • ObjectOutputStream oos = new ObjectOutputStream(바이트출력스트림);
    • 객체를 직렬화하기 위해서 writeObject()메소드를 사용
    • oos.writeObject(객체);
  • ObjectInputStream
    • 바이트 입력 스트림과 연결되어 객체를 역직렬화하는 역할
    • ObjectInputStream = new ObjectInputStream(바이트입력스트림);
    • 입력스트림에서 읽은 바이트를 역직렬화해서 객체로 생성 -> 리턴타입은 Object타입이기때문에 객체 원래의 타입으로 변환해야 한다.
    • 객체타입 변수 = (객체타입) ois.readObject();

2. 역직렬화(Deserialize)

  • byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술
  • 스트림으로부터 데이터를 읽어서 객체를 만드는 것
  • 역직렬화 조건
    : 직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 하며
    import되어 있어야 함
    : 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있음
  • 역직렬화 방법
    : java.io.ObjectInputStream을 사용하여 역직렬화

3. transient

  • 객체의 데이터 중 일부의 데이터는(패스워드와 같은 보안) 여러가지 이유로
    전송을 하고 싶지 않을 수 있다. 이러한 변수는 직렬화에서 제외해야 되며
    변수에 transient를 선언한다.
  • 직렬화가 되지 않을 멤버변수에 지정한다.
  • static 필드자체는 직렬화 대상에서 제외
  • 직렬화가 되지 않은 멤버변수는 기본값으로 저장된다.
    : 참조변수 = null, 숫자형 변수=0

객체 입출력 보조 스트림 예제

T15_ObjectStreamTest

public class T15_ObjectStreamTest {
	public static void main(String[] args) {
		//Member 인스턴스 생성
		Member mem1 = new Member("오혁", 28, "대전");
		Member mem2 = new Member("이규형", 30, "경기");
		Member mem3 = new Member("조승우", 40, "강원");
		Member mem4 = new Member("소녜진", 25, "제주");
		
		try {
			//객체를 파일에 저장하기
			
			//출력용 스트림 객체 생성
			ObjectOutputStream oos = new ObjectOutputStream(
										new BufferedOutputStream(
											new FileOutputStream("d:/D_Other/memObj.bin")));
			//쓰기 작업
			oos.writeObject(mem1);//직렬화
			oos.writeObject(mem2);//직렬화
			oos.writeObject(mem3);//직렬화
			oos.writeObject(mem4);//직렬화
			
			System.out.println("쓰기 작업 완료");
			oos.close();
			//===========================================================
			//저장한 객체를 읽어와 출력하기
			
			//이력용 스트림 객체 생성
			ObjectInputStream ois = new ObjectInputStream(
										new BufferedInputStream(
											new FileInputStream("d:/D_Other/memObj.bin")));
			
			Object obj = null;
			
			
			try {
				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("-----------------------");
				}
				
				ois.close();
			}catch(ClassNotFoundException ex) {
				
			}
		} catch (IOException ex) {
			//더이상 읽어올 객체가 없으면 예외 발생함.
			//ex.printStackTrace();
			System.out.println("출력 작업 끝...");
		}
	}
}

회원정보 VO

  • 클래스에 implements Serializable
  • transient : 직렬화대상 제외
  • 직렬화가 되지 않은 멤버변수는 기본값으로 저장
class Member implements Serializable{//자바는 Serializale 인터페이스를 구현한
				//클래스만 직렬화 할 수 있도록 제한하고 있음

	private transient String name; //직렬화대상제외 -> 기본값으로 저장 (null)
	private transient int age; //직렬화대상제외 -> 기본값으로 저장 (0)
	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;
	}
	
}
profile
HI :)
post-custom-banner

0개의 댓글