Java의 Serialization, 직렬화 기능은 한 객체에 영속성을 부여하여
서로 다른 시스템에서 객체의 사본을 공유받을 수 있게 하는 기능이다.
클래스는 Serializable Interface를 구현해야 직렬화가 가능하다.
이 때, 사본은 ByteArray형태로 객체의 클래스, 값 등이 저장되며
이는 ObjectInputStream / ObjectOutputStream 에 의해 관리된다.
직렬화 과정은 static(전역), transient(직렬화 금지) 등의 처리가 된 변수들은 저장하지 않으며,
역직렬화 과정에서도 직렬화 데이터 대로 변수를 재생성하는 것이 아니라,
이미지 그대로 구현하는 것이므로 생성자가 실행되지 않는다.
또한, 직렬화/역직렬화 과정을 직접 수행하려면
Serializable Interface가 아닌 Externalizable Interface를 상속하여
직접 readExternal / writeExternal 을 구현하면 되며,
자식클래스의 경우 부모클래스의 readExternal / writeExternal 을 super를 통해 먼저 호출하고 진행한다.
java.io.Serializable [ Interface ]
이 인터페이스를 구현하는 클래스들은 직렬화가 가능하다.
java.io.Externalizable [ Interface ]
extends Serializable
- 함수 ( Methods )
readExternal(ObjectInput in) : in.read-()를 통해 역직렬화를 수행한다.
writeExternal(ObjectOutput out) : out.write-()를 통해 직렬화를 수행한다.
java.io.ObjectOutputStream
extends OutputStream
implements ObjectOutput(오브젝트 출력), ObjectStreamConstants(직렬화와 관련된 변수들)
객체 직렬화를 위한 OutputStream이다.
- 생성자 ( Constructor )
new ObjectOutputStream(OutputStream)
- 지역 함수 ( Local Methods )
write(byte), writeDouble(double), writeInt(int), writeObject(object) ... : 객체를 출력한다.
java.io.ObjectInputStream
extends InputStream
implements ObjectInput(오브젝트 입력), ObjectStreamConstants
객체 역직렬화를 위한 InputStream이다.
- 생성자 ( Constructor )
new ObjectInputStream(InputStream)
- 지역 함수 ( Local Methods )
read(), readInt(), readDouble(), readObject() ... : 객체를 입력받는다.
만약 Externalizable를 상속받고 직렬화/역직렬화를 직접 구현하는 경우
write와 read의 종류를 다르게 하거나 순서를 잘못하면 바로 에러가 나므로 똑같이 진행해야한다.
'3-2공부 > 네트워크프로그래밍' 카테고리의 다른 글
[Java] 암호화 (0) | 2022.10.22 |
---|---|
[Java] 압축 (0) | 2022.10.22 |
[Java] Writer (0) | 2022.10.22 |
[Java] Reader (0) | 2022.10.22 |
[Java] OutputStream (0) | 2022.10.22 |