JAVA/포스팅

자바 직렬화 transient

짜집퍼박사(짜박) 2023. 11. 27. 13:41

transient 키워드는 직렬화에서 특정 필드를 제외하고자 할 때 사용되는 키워드입니다. 직렬화는 객체의 상태를 바이트 스트림으로 변환하는 과정이며, 모든 객체의 필드가 이 과정에 포함되게 됩니다. 그러나 때로는 특정 필드를 직렬화에서 제외하고 싶을 때가 있습니다. 이때 transient 키워드를 사용합니다.

 

transient 사용 예제

import java.io.*;

class MyClass implements Serializable {
    private static final long serialVersionUID = 1L;
    private int regularField;
    private transient String transientField;

    // 생성자, 메서드 등 클래스의 내용
    // ...
}

위의 예제에서 transientField는 transient 키워드로 선언되었습니다. 이는 해당 필드가 직렬화에서 제외된다는 것을 의미합니다. 즉, transientField는 객체가 직렬화될 때 포함되지 않고, 역직렬화될 때는 기본값으로 초기화됩니다.

 

transient 키워드의 사용 이유

1. 보안 및 민감한 정보: 어떤 필드는 보안상 민감한 정보일 수 있습니다. 이러한 정보를 직렬화하지 않고 제외함으로써 보안 문제를 완화할 수 있습니다.

private transient String password;

2. 임시 데이터: 객체의 특정 필드가 일시적이고 영구적으로 저장할 필요가 없는 경우 transient를 사용하여 해당 필드를 직렬화에서 제외할 수 있습니다.

private transient String cacheData;

3. 직렬화 불가능한 객체 참조: 어떤 필드가 직렬화할 수 없는 객체를 참조한다면, 해당 필드는 transient로 선언하여 직렬화에서 제외됩니다.

private transient NonSerializableObject nonSerializableObject;

 

주의사항

1. transient 필드의 초기화: transient로 선언된 필드는 직렬화될 때 제외되기 때문에 역직렬화 후에는 기본값으로 초기화됩니다. 초기화에 대한 로직이 필요하다면 readObject 메서드를 사용하여 직접 초기화할 수 있습니다.

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    transientField = "Default value"; // 초기화 로직
}

2. transient와 static: transient와 static을 동시에 사용할 수 없습니다. static 필드는 클래스의 상태를 나타내므로 인스턴스마다 다르게 직렬화할 필요가 없기 때문입니다.

private transient static int staticTransientField; // 컴파일 에러

3. 직렬화된 클래스 버전 UID의 영향: transient로 선언된 필드가 있다면 해당 필드는 직렬화에서 제외되지만, 클래스의 직렬화 버전 UID는 포함됩니다. 그러므로 transient 키워드를 추가하거나 제거해도 클래스의 UID는 변경되지 않습니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 클라이언트(client)와 서버(sever)  (0) 2023.11.27
자바 네트워킹(Networking)  (0) 2023.11.27
자바 직렬화 Serializable  (0) 2023.11.26
자바 ObjectOutputStream  (0) 2023.11.26
자바 ObjectInputStream  (0) 2023.11.26