보조스트림 : Object
1. ObjectInputStream/ObjectOutputStream
객체를 파일 또는 네트워크로 입출력 할 수 있는 기능 제공
단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화 필수
2.직렬화/역직렬화
1)직렬화
Serializable 인터페이스를 implements하여 구현 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지 만 transient키워드를 사용한 필드는 직렬화에서 제외
2)역직렬화
직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스 사용 단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화 실패
3)serialVersionUID 필드
직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할로 컴파일 시 JVM이 자동으로 serialViersionUID 정적 필드를 추가해줘 별도로 작성하지 않아도 오류는 나지 않지만 자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있어 명시 권장.
4)직렬화 목적
객체를 다른 프로그램, 컴퓨터에 전달할 때 여러 필드들을 한줄로 구성하여 처리함으로써 서로 다른 컴퓨터 구조라도 해당 객체를 올바르게 인식할 수 있게 해주는 기술.
클래스에 적용함
-> 클래스가 객체 생성하고, 그 객체를 Object 입/출력에 사용할 경우, 객체 상태 그대로 스트림으로 전송할 수 없다.
--> 직렬화가 적용된 클래스 일때는 바이트 스트림 크기에 맞춰서, 객체가 가진 필드들을 기록된 순서대로바이트 단위로 길게 연속으로 나열 처리를 한다
직렬화 처리된 객체 정보가 바이트 스트림을 거쳐 전송된다.
읽어 들일 때는 역직렬화가 자동으로 처리된다.
-> 바이트 단위로 나열된 값들을 다시 각 자료형별 필드값으로 바꾼다.
직렬화 이전 클래스로 object스트림을 사용.
Output스트림부터 직렬화가 안됬다는 오류를 출력하게 된다. 즉 객체를 저장하는 ObjectStream을 사용 할 때에는 반드시 객체에 직렬화가 필요하다.
직렬화를 적용한 클래스의 모습이다.
인터페이스 Serializable를 implements하고,
private static final long serialVersionUID = 주소L; 을 해주면된다.
주소를 따로 지정하지 않을 경우 컴파일시 JVM에서 자동적으로 주소를 지정해준다.
이제 object 스트림을 실행해 보자.
Output을 실행해 파일에 저장된 모습이다. 파일이 깨져있는 것처럼 보인다.
Input을 실행하면 잘 나올지 걱정이된다. 한번 실행해보자
객체배열에 저장 후 오버라이딩한 toString메소드 반복문 출력시 걱정과 달리 잘나온다.
다만 읽고 쓰다가 값이 이상하게 들어가 버리는 경우에는 형변환 오류를 뿜기도 하니 주의해야 한다.