good_da22 's devLog

Java

직렬화(Serialization)

good_da22 2022. 7. 31. 22:25

객체 직렬화 Serialization


직렬화(serialization)


객체데이터 스트림으로 만드는 것

객체를 파일등에 저장하거나 네트워크로 전송하기 위해 연속적인 데이터로 변환하는 것


역 직렬화(deserialization)


직렬화의 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것


직렬화 조건


java.io.Serializable 인터페이스를 구현해야 한다.

추가 구현 메서드는 없다

@SuppressWarnings("serial") 경고를 무시할 수 있지만 사용하지 말 것

Serializable를 구현하는 클래스를 상속받는다면, 자식 클래스에서는 Serializable을 구현하지 않아도 된다.

부모 클래스가 Serializable을 구현하지 않은 상태에서 자식 클래스가 Serializable을 구현하여 직렬화할 경우 부모 클래스의 인스턴스 변수는 직렬화 대상에서 제외된다.

Serializable을 구현하였지만 직렬화할 수 없는 클래스의 객체를 인스턴스 변수로 참조하는 경우 NoSerializableException이 발생한다.

Object 클래스는 Serializable를 구현하지 않아 직렬화 할 수 없다.

인스턴스 변수의 타입이 아닌 실제로 연결된 객체의 종류에 의해서 직렬화 여부가 결정된다.


직렬화하고자 하는 객체의 클래스에 직렬화가 안 되는 객체에 대한 참조를 포함하는 경우

transient 키워드를 통해 직렬화 대상에서 제외 가능


serialVersionUID


클래스의 변경 여부를 파악하기 위한 유일 키

객체가 직렬화 할 때 클레스에 정의된 멤버들의 정보를 이용해 serialVersionUID라는 클래스의 버전을 자동생성해서 직렬화 내용에 포함

직렬화 할 떄의 UID와 역 직렬화 할 떄의 UID가 다를 경우 예외 발생

직렬화되는 객체에 UID가 설정되지 않았을 경우 컴파일러가 자동 생성

멤버 변경으로 인한 컴파일 시마다 변경 -> InvalidClassException 발생

직렬화되는 객체에 대해서 serialVersionUID 설정 권장



ObjectInputStream & ObjectOutputStream


InputStream 과 OutputStram을 직접 상속받지만 노드 스트림을 필요로 하는 보조 스트림

객체를 생성할 때 입출력(직렬화/역직렬화)할 스트림을 지정 필요


  • ObjectInputStream()

    • public ObjectInputStream(InputStram in) throws IOException

      주어진 InputStream 인스턴스를 input source로 ObjectInputStream 생성

  • readObject()

    • public final Object readObject() throws IOException, ClassNotFoundException

      직렬화된 데이터를 역직렬화해서 Object로 반환


  • ObjectOutputStream()

    • public BufferedOutputStream(OutputStram out) throws IOException

      주어진 OutputStram 인스턴스를 output source로 ObjectOutputStream 생성

  • writeObject()

    • public final Object writeObject(Object obj) throws IOException, ClassNotFoundException

      obj를 직렬화해서 출력

'Java' 카테고리의 다른 글

Smart Card IO  (0) 2023.03.22
파싱(Parsing)  (0) 2022.07.31
보조스트림(Stream)  (0) 2022.07.31
파일(File)  (0) 2022.07.31
입출력 (I/O) & 스트림(Stream)  (0) 2022.07.31