ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Class]/[Java i/o] 객체의 직렬화
    Java-diary/REFERENCE TYPE 2020. 2. 7. 17:59

    정의

    • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용 할 수 있도록 byte형태로 
      데이터를 변환하는 기술 
      -JVM의 메모리에 상주(힙 또는 스택) 되어 있는 객체 데이터를 바이트 형태로 변환하는 기술-
    • 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)
      -직렬화된 바이트 형태의 데이터를 객체로 변환 해서 JVM으로 상주시키는 기술-

    *나오게 된 배경

    자바 I/O 처리는 정수,문자열,바이트 단위의 처리만 지원했었다. 복잡한 객체의 내용을 저장/복원하거나,네트워크로 전송하기 위해서는 객체의 멤버변수의 각 내용을 일정한 형식(패킷)으로 만들어 전송해야 했다.객체 직렬화는 객체의 내용을 자바 I/O가 자동적으로 바이트 단위로 변환하여,저장/복원하거나 네트워크로 전송할 수 있도록 기능을 제공해준다.

     

     

    객체 전송 단계

    1. 직렬화된 객체를 바이트 단위로 분해-marshalling-
    2. 분해된 데이터를 순서에 따라 전송
    3. 전송 받은 데이터를 원모습으로 복구 -unmarshalling-

    serializable Interface 구현

    *Marshalling

    • 데이터를 바이트 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업
    • 마셜링을 적용할 수 있는 데이터 : Primitive Type,Reference Type중 Serializable인터페이스 구현 객체

    *Unmarshalling

    • Marshalling을 통해 바이트로 분해된 덩어리를 원래의 객체로 복구하는 작업
    • 복구를 위해 어떤 객체 형태로 복구할지 형 변환을 명확하게 해주어야 한다.

    *ObjectOutputStream 클래스 

    • 객체는 Primitive Type과 달리 일정한 크기를 가지지 않고 객체 내부의 멤버 변수가 다르기 때문에 크기가 천차만별로 달라진다. 이러한 문제를 처리할 수 있는게 ObjectOutputStream 클래스

    출력
    Object에 byte스타일로 저장되어 있다.

     

    *ObjectInputStream 클래스

     

     

     

    ObjectStream 특징

    •  ObjectStream은 직접적으로 파일에 접근할 수 있는 능력이 없다.
    • 간접적 접근을 위해 FileStream을 이용한다.
    • FileStream과 OutputStream은 ByteStream의 자식 Class일뿐 직접적인 관계는없다.
    • ObjectStream의 생성자 매개변수에 ByteStream을 매개변수로 가지는 생성자가 존재
    • ByteStream변수에 자식 Class인 FileStream의 참조값을 넣어 이용

     

     

    직렬화 조건

    • Primitive Type
    • Serializable 인터페이스 구현 객체
    • 해당 객체의 멤버 모두 Seralizable 인터페이스 구현된 객체
    • Transient 사용 되지 않은 멤버를 가진 객체 

     

    *Transient

    객체를 직렬화하여 저장할 때 이 변수는 저장하지 않도록 하는 역할

     

    transient 선언

     

     

     

     

    SerialVersionUID

    • 버전관리 
    • 직렬화를 하게 되면 자동으로 UID 고유 번호를 생성
    • UID는 직렬화 역직렬화 시 주요한 역할 
      -값이 맞는지 확인후 처리하기 때문 다르면 오류가 난다.- 
    • SerialVersionUID를 직접 선언후 관리하는 방식을 권장.

    댓글

Designed by Tistory.