UpDown Dev Story
자바(Java) 직렬화(Serializable) 대해 알아보자 본문
직렬화(Serializable) 란?
- 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술.
- JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
역직렬화(Deserialize) 란?
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 부릅니다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태.
직렬화 방법
- 변환하려는 객체가 Serializable 인터페이스를 implements 해야한다
- serialVersionUID라는 값을 지정해 주는 것을 권장한다
- 별도로 지정하지 않으면, 자바 소스가 컴파일될때 자동으로 생성된다.
- serialVersionUID라는 값을 지정해 주는 것을 권장한다
- 만약 Serializable 인터페이스를 implements 하지 않았다면 NotSerializableException이 발생한다
- 변환하려는 객체에
serialVersionUID
- 직렬화한 객체를 역직렬화 할때 해당 객체가 같은 객체인지 확인 할 수 있도록 하는 값
- 클래스 이름이 같아도 serialVersionUID 값이 다를경우 다른 클래스로 인식한다
- serialVersionUID값이 같아도 클래스의 변수의 개수나 타입 등이 다르면 다른 클래스로 인식한다
예시
- Serializable 인터페이스를 implements한 객체를 생성하고 해당 객체를 로컬 PC에 저장한다 (xxx.obj 로 저장된다)
- Serializable 인터페이스를 implements한 객체 타입으로 해당 파일을 읽어온다 (정상적으로 객체를 읽어온다)
- 이번에는 Serializable 인터페이스를 implements한 객체에 어떤 변경이 생긴다 (serialVersionUID가 다시 채번됨)
- Serializable 인터페이스를 implements한 객체에 변수를 추가한 타입으로 해당 파일을 읽어온다 (serialVersionUID가 맞지 않다고 에러가 발생한다)
- 이럴 경우에serialVersionUID를 명시적으로 선언해주면 해결 할 수 있다
transient
- 객체의 데이터 중 일부의 데이터는(패스워드와 같은 보안) 여러가지 이유로 전송을 하고 싶지 않을 수 있다. 이러한 변수는 직렬화에서 제외해야 되며, 이를 위해서 변수에 transient를 선언한다.
'Java' 카테고리의 다른 글
자바(Java) 오브젝트(Object) 클래스(Class)에 대해 알아보자 (0) | 2021.07.11 |
---|---|
자바(Java) String, StringBurffer, StirngBuilder 에 대해서 알아보자 (0) | 2021.07.11 |
자바(Java) 컬렉션(Collection)에 대해 알아보자 (0) | 2021.07.09 |
자바(Java) 스레드(Thread) 에 대해 알아보자 (0) | 2021.07.08 |
자바(Java) 에러(Error) 와 예외(Exception)에 대해서 알아보자 (0) | 2021.07.08 |
Comments