본문 바로가기
[Android]

[local class incompatible 에러] 자바 직렬화 - 역직렬화

by Hevton 2020. 10. 18.
반응형

자바에서 serializable 을 통해 객체를 직렬화하고 역직렬화하여 파일형식으로 저장할 수 있다.

이렇게 쉬운 방법을 제공하기 때문인지 관리에 대해서 까다롭게 주의할 점이 있다.

 

아래 클래스가 있다.

import java.io.Serializable;

public class data implements Serializable {
    public boolean a = false;
}

그리고 나는 이 클래스의 객체를 아래와 같은 형식으로 파일로 저장했다.

data d = new data();
d.a = true;

FileOutputStream fos = openFileOutput("options.txt", MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oss.write(d);

 

그리고, 어플리케이션을 업데이트 함에 있어서, data 클래스에 새로운 정보가 추가될 필요를 느껴 추가했다.

public class data implements Serializable {
    public boolean a = false;
    public boolean b = false;
}

그리고 평소와 다름없이 아래처럼 값을 읽어들여보면, 기대하는 선에서는 b의 값이 NULL이라도 들어가며 오류가 없을 것 같지만

Exception이 발생한다.

FileInputStream fis = openfileInput("options.txt");
ObjectInputStream ois = new ObjectInptStream(fis);
data d = (data)ois.readObject(); // Exception : local class incompatible serialversionuid

 

Serializable 을 implements한 클래스에 아래와 같은 변수 값이 지정되어 있지 않으면 JVM이 클래스 구조 정보를 토대로 해싱값을 만들어낸다. (따라서 사용하는 JVM에 따라 값이 다를 수도 있다)

private static final long serialVersionUID = ?L

그리고 직렬화 - 역직렬화 시에 이 값을 키값으로 사용해서 객체의 호환을 따진다.

즉 이 값이 같아야 데이터가 다시 역직렬화 되는 것이다.

 

클래스 구조정보에 따라 값을 생성하기 때문에 클래스 정보가 달라지면 값도 달라진다. 그래서 값이 추가되거나 삭제되거나 하면 SerialVersionUID도 변경되어 매칭되지가 않는 것이다.

 

따라서 사전에 SerialVersionUID를 명시적으로 지정하여 선언해주면 좋다. 그럼 이 값이 같기 때문에 오류가 뜨지 않는다.

 

값을 지정해주지 않으면 컴파일 환경에 따라서 이 SerialVersionUID가 민감하게 변할 우려가 있으므로, 이렇게 명시적으로 지정해주는것을 권장한다.

 

직렬화 - 역직렬화 할 클래스에 private static final long serialVersionUID 값을 명시적으로 지정하여 선언해놓는것이 좋다는 것이 결론.

 

 

참고자료

stackoverflow.com/questions/10378855/java-io-invalidclassexception-local-class-incompatible

 

java.io.InvalidClassException: local class incompatible:

I created client and server and then added a class in client side for serializing purposes, then simply just went to the folder of the client in my hard drive and copy paste it to the server correp...

stackoverflow.com

woowabros.github.io/experience/2017/10/17/java-serialize2.html

 

자바 직렬화, 그것이 알고싶다. 실무편 - 우아한형제들 기술 블로그

자바의 직렬화 기술에 대한 대한 두 번째 이야기입니다.실제 자바 직렬화를 실무에 적용해보면서 주의해야 할 부분에 대해 이야기해보려고합니다.

woowabros.github.io

 

반응형