직렬화(Serialization)는 객체의 상태를 바이트 스트림으로 변환하는 메커니즘입니다. 반대로 역직렬화(Deserialization)는 바이트 스트림을 실제 자바 객체로 재생성 재생성하는 메커니즘입니다. 이런 메커니즘들은 객체를 저장하거나 전송하는데 사용됩니다.
생성된 바이트 스트림은 플랫폼에 독립적입니다. 따라서 한 플랫폼에서 직렬화된 객체는 다른 플랫폼에서 역직렬화되어 사용가능합니다.
Java 객체를 직렬화하기 위해서는 아래와 같이 java.io.Serializable
인터페이스를 구현해야 합니다.
public class JavaClass implements Serializable {
...
}
Serializable은 마커 인터페이스(데이터와 메소드를 가지지 않는 인터페이스)입니다. 마커 인터페이스는 해당 객체가 특정 기능을 수행할 수 있도록 표시하는데 사용됩니다. 마커 인터페이스의 다른 예로는 Cloneable
과 Remote
가 있습니다.
ObjectOutputStream 클래스와 ObejctInputStream 클래스는 각각 객체 직렬화, 역직렬화 메소드를 제공하는 스트림 클래스입니다.
ObjectOutputStream 클래스는 객체를 직렬화시키는 writeObject()
메소드를 가지고 있습니다.
public final void writeObject(Object obj) throws IOException
ObjectInputStream 클래스는 객체를 역직렬화시키는 readObject()
메소드를 가지고 있습니다.
public final Object readObject() throws IOException, ClassNotFoundException
writeObject() 메소드 내부에는 아래와 같이 Serializable 인터페이스 구현체 여부를 확인 하는 로직이 존재합니다. Serializable 인터페이스를 구현하지 않은 객체(Enum, String 제외)가 들어올 경우 NotSerializableException 예외가 발생하게 됩니다.
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
public class File implements Serializable {
...
private transient PathStatus status = null;
...
}
class A implements Serializable{
// B also implements Serializable interface.
B ob=new B();
}
public class File implements Serializable {
...
private static final long serialVersionUID = 301077366599181567L;
...
}
출처
- https://www.geeksforgeeks.org/serialization-in-java/?ref=lbp
- https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization
- https://zeroco.tistory.com/17
- https://m.blog.naver.com/writer0713/220922099055