3-2공부/네트워크프로그래밍

[Java] Serialize, 직렬화

KGW2027 2022. 10. 22. 15:29
728x90
반응형

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의 종류를 다르게 하거나 순서를 잘못하면 바로 에러가 나므로 똑같이 진행해야한다.

728x90
반응형

'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