1. 직렬화(Serialization)
직렬화는 객체를 바이트 스트림으로 변환하는 과정을 말합니다. 이렇게 직렬화된 객체는 파일에 저장하거나 네트워크를 통해 전송하는 등의 용도로 활용됩니다.
2. 역직렬화(Deserialization)
역직렬화는 직렬화된 바이트 스트림을 다시 객체로 변환하는 과정을 의미합니다. 저장된 데이터나 전송된 데이터를 읽어와 다시 원래의 객체로 복원하는 것이 역직렬화입니다.
3. 직렬화를 사용하는 이유
- 데이터 저장 및 교환: 직렬화를 통해 객체를 바이트 스트림으로 변환하면 파일에 저장하거나 네트워크를 통해 다른 시스템 간에 객체를 주고받을 수 있습니다. 이는 데이터를 영구적으로 저장하거나, 원격 시스템 간에 데이터를 주고받을 때 유용합니다. 예를 들어, 파일 시스템에 객체를 저장하거나, 웹 애플리케이션에서 클라이언트와 서버 간에 객체를 교환할 때 활용됩니다.
- 복잡한 객체 저장: 직렬화는 객체 그래프 내의 모든 객체를 저장하고 복원할 수 있어, 복잡한 구조의 객체도 효율적으로 저장할 수 있습니다. 이는 객체 간의 관계와 구조를 그대로 유지하면서 데이터를 전송하거나 저장할 수 있음을 의미합니다. 다양한 데이터 타입과 복잡한 객체 구조를 가진 자바 클래스를 직렬화할 때 매우 효과적입니다.
4. ObjectOutputStream, ObjectInputStream
- ObjectOutputStream: 객체를 직렬화하여 바이트 스트림으로 출력하는 데 사용됩니다.
- ObjectInputStream: 직렬화된 바이트 스트림을 읽어와 객체로 역직렬화하는 데 사용됩니다.
5. 직렬화 및 역직렬화 예시
import java.io.*
// Serializable을 구현한 데이터 클래스
data class Person(val name: String, val age: Int) : Serializable
fun main() {
// 객체 생성
val person = Person("John Doe", 30)
// 객체를 직렬화하여 파일에 저장
ObjectOutputStream(FileOutputStream("person.ser")).use { it.writeObject(person) }
// 파일에서 객체를 읽어와 역직렬화
ObjectInputStream(FileInputStream("person.ser")).use {
val deserializedPerson = it.readObject() as Person
println(deserializedPerson)
}
}
6. 직렬화 요소 제외
transient 키워드는 특정 필드를 직렬화에서 제외시킬 때 사용합니다. 이를 통해 보안상이나 직렬화의 효율성을 위해 특정 정보를 제외할 수 있습니다.
data class Person(val name: String, @Transient val sensitiveInfo: String) : Serializable
7. SerialVersionUID
SerialVersionUID는 직렬화된 클래스의 버전을 식별하는데 사용됩니다. 클래스가 수정되면 버전 번호를 변경하여 호환성을 유지할 수 있습니다.
8. 직렬화 단점
1. 직렬화는 용량이 크다
2. 역직렬화는 보안상 위험한 부분이 존재한다
Reference
☕ 자바 직렬화(Serializable) - 완벽 마스터하기
자바의 직렬화 & 역직렬화 직렬화(serialize)란 자바 언어에서 사용되는 Object 또는 Data를 다른 컴퓨터의 자바 시스템에서도 사용 할수 있도록 바이트 스트림(stream of bytes) 형태로 연속전인(serial) 데
inpa.tistory.com
'Kotlin 문법' 카테고리의 다른 글
[Kotlin] why migrate from collectAsState() to collectAsStateWithLifecycle() (0) | 2023.11.03 |
---|---|
[Kotlin] Flow의 collectAsStateWithLifecycle()로 상태를 읽는 방법 (0) | 2023.11.03 |