JAVA 에서 객체를 파일 혹은 네트워크로 주고 받기 위해서는, byte 로 변환해서 순서대로 나열하여야 합니다. 이러한 작업을 객체의 직렬화라고 합니다. 


객체의 직렬화를 진행하기 위해서는, Serializable 인터페이스를 기본적으로 상속받아야 합니다. (직렬화 하려는 클래스 안에 멤버 변수로 객체가 있다면 그 객체 또한 Serializable 인터페이스를 상속받아야 합니다.)


객체를 직렬화 (marshalling) 를 수행하기 위해서는, ObjectOutputStream 클래스의 writeObject 메소드를 사용하고, 객체의 역직렬화 (unmarshalling) 를 수행하기 위해서는, ObjectInputStream 클래스의 readObject 메소드를 사용하면 되고, 이 때는, 읽는 객체의 클래스로 형변환을 반드시 해야 합니다. writeObject 를 사용하면, 클래스의 멤버 변수가 순서대로 직렬화 / 역직렬화가 되는데, 객체를 한꺼번에 직렬화 하지 않고, 변수를 개별적으로 직렬화하려고 하고 싶을 때는, writeBoolean, writeByte, writeInt 등의 기본자료형 메소드를 통해 순차적으로 직렬화하고, 역직렬화하고 싶을 때는, 직렬화한 순서대로 readBoolean, readByte, readInt 등의 기본자료형 메소드를 통해 차례대로 가져오면 됩니다.


상속 관계에 있어서는, 부모 클래스가 기본적으로 Serializable 인터페이스를 상속하면 자식 클래스도 Serializable 인터페이스를 상속받게 되어 직렬화가 가능해지는데, 만약 부모 클래스에 매개변수가 없는 기본 생성자가 정의되어 있다면, Serializable 인터페이스를 상속하지 않더라도, 자식 클래스에서 Serializable 인터페이스를 상속해서 직렬화가 가능해집니다.




(ObjectOutputStream 클래스 참고)

http://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html


(ObjectInputStream 클래스 참고)

http://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html


(Serializable 인터페이스 참고)

http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

by kkikkodev 2015. 7. 14. 15:45