가끔 인터페이스를 보다보면 Serializable 이란 인터페이스를 상속한 클래스를 볼 수 있었다.

검색해봤을땐 직렬화를 가능하게 해주는 인터페이스고, 그렇게 하여 파일이나과 인터넷으로 객체를 저장할 수 있다는 설명을 보았는데, 의문점이 모두 해결이 안되서 조금 더 찾아보았다.

Serializable(직렬화)란?

객체를 직렬화 한다는 것은 객체의 상태바이트스트림으로 변환한다는 의미이다.

그럼으로써 바이트 스트림은 객체의 복사본으로 재변환될 수 있다.

 

Serialization & Deserialization in Java diagram

 

쓰임

바이트 스트림은 데이터를 송수신하거나 파일에 저장하는데 사용한다.

따라서 직렬화는 객체를 파일에 저장하거나(File.java, ObjectInputStream.java), 인터넷에 정보를 보내거나(URI.class), 데이터베이스에 저장할 떄(Hibernate, JPA, EJB)등에 사용하게 된다.

실제로 자바에서 Serializable 인터페이스를 구현한 클래스들을 찾아보면 확인할 수 있다.

 

file.java in IntelliJ Search

 

URI.java in IntelliJ Search

hibernate-mapping-3.0 dtd in IntelliJ Search

Use of Serialized Object

 

SeriaVersionUID

직렬화 실행은 각각의 직렬화 클래스의 SeriaVersionUID 라고 불리는 버전 번호와 연관되어 있다.

신뢰성을 위해 직렬화와 역직렬화 후 SeriaVersionUID를 비교하는데 이때 불일치하게되면 InvalidClassException이 발생하게 된다.

serialVersionUid는 static, final, Long으로 선언해야 한다.

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

명시적으로 SeriaVersionUID을 선언하지 않으면 기본값이 생성되긴 하지만, 이는 다양한 컴파일러구현체에 민감하게 영향을 받기 때문에, 직접 명시적으로 선언할 것을 강하게 권장하고 있다.

If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization.

 

참고

 

 

'IT > JAVA' 카테고리의 다른 글

[Java] Cannot construct instance of `class`  (1) 2023.11.18
[Mybatis] CDATA 란?  (0) 2023.03.15

+ Recent posts