자바 serialization

아기코딩단2·2022년 1월 20일

 Data(객체)를 파일로 변경하는 경우 ObjectOutputStream 데코레이터 클래스에 있는 writeObject()메서드를 사용할 수 있는데 여기에 들어가는 객체는 java.io.serializable 인터페이스를 구현해서 만든 객체여야한다. 이후 ObjectOutputStream 내부에서 serialization(직렬화)를 하게되고 byte[]배열에 넣어준다. 이후 FileOutputStream을 통해 파일로 변환된다. FileOutputStream을 사용할 때 buffer를 사용할 수도 있는데 이때 주의할 점은 buffer는 배열이 다 찬후 값을 내보내기 때문에 마지막에 .flush() 메서드를 사용하여 마지막 남은 값들도 내보내줘야한다.

 serialization의 유효성 검사는 serialVersionUID이라는 static field를 통해서 하게되는데 이는 우리가 지정해주지 않으면 compiler에서 자동으로 추가해준다. 그렇다면 serialization의 유효성 검사는 왜 해주는가? 이는 byte[]에서 인스턴스로 복원할 때 사용된다. 일종의 버전이라고 있다. 즉 파일에 저장된 버전번호와 복원할 때 사용한 버전정보(serialVersionUID)이 다르게 되면 deserialze 오류가 뜨게된다. 즉 JVM에서 저장할 때 형식과 읽을 때 메모리 형식이 다르다고 판단하여 오류를 띄운다.

 버전 정보(serialVersionUID)는 언제 바뀌게 되는가? field 추가/삭제시 바뀌게 된다. 그렇다면 우리가 이런 식으로 private static final long serialVersionUID = 1208L; 과 같이 serialVersionUID을 설정해주게 된다면 더 유용하게 사용할 수 있다는 장점이 있다. 그 대신 deserialize 할 때 참조변수의 경우 null, int는 0 등으로 초기화된다.

 그리고 인스턴스 앞에 transient int sum;과 같이 transient라는 modifier를 주게되면 serialize대상에서 제외시킨다. 이는 데이터의 왜곡된 값을 막기 위함이다. 예를 들자면 다른 필드값을 계산한 경우 serialize 대상에서 제외시키고 deserialize한 후에 계산한다.

profile
레거시 학살자

0개의 댓글