2014-12-29 4 views
2

ObjectOutputStream과 협력하여 내 객체를 .dat 파일에 저장합니다. 내 개체의 소스 코드를 변경하면 (예를 들어 하나의 메서드 (getter)를 추가하는 경우) 입력 스트림에서 데이터를로드 할 수없고 약 Serializable에 대한 오류를 알릴 수 없습니다. 이 문제를 해결할 수 있습니까? 내 소스 코드를 변경하면 매번 새로운 .dat 파일을 생성해야합니다.ObjectOutputStream/JAVA에서 Serializable 입력

Error: java.io.InvalidClassException: MapVerb.RealVerb; local class incompatible: stream classdesc serialVersionUID = -887510662644221872, local class serialVersionUID = 7992494764692933500 
+1

무엇이 오류입니까? – gimpycpu

답변

5
: SAVE

public void saveToFile(HeaderOfMapTeachStructure hm, String nameOfFile) { 
    try (ObjectOutputStream os = new ObjectOutputStream(
      new FileOutputStream(nameOfFile + "." + this.TYPE_OF_FILE))) { 
     os.writeObject(hm); 
    } catch (IOException e) { 
     System.out.println("Error: " + e); 
    } 
} 

LOAD

public MapStandard loadFromFileMS(String nameOfFile) { 
    MapStandard hm = null; 
    InputStream inputStreaminputStream 
      = getClass().getClassLoader(). 
      getResourceAsStream("data/" + nameOfFile + ".data"); 
    try { 
     try (ObjectInputStream is = new ObjectInputStream(inputStreaminputStream)) { 
      hm = (MapStandard) is.readObject(); 
     } 
    } catch (IOException | ClassNotFoundException e) { 
     System.out.println("Error: " + e); 
    } 
    return hm; 
} 

오류가 ( 개체 TYPE 리턴 값 망가 LOOK)

이 방법을 사용하여

이 문제를 해결할 수 있습니까?

예. 직렬화가 중단되는 이유는 생성 된 버전 번호가 변경되기 때문입니다. 이것을 명시 적으로 지정하면 생성되지 않으며 버전 관리를 제어 할 수 있습니다. 즉, 객체에있는 필드를 변경하거나 해당 필드의을 의미하는 을 의미하는 경우 조심해야합니다. 버전 번호를 직접 변경해야합니다.

이 같은 직렬화 버전을 지정합니다

// It doesn't have to be constant, but that's fairly common. 
private static final long serialVersionUID = ...; // Some constant 

자세한 내용은 Serializable 설명서를 참조하십시오.

데이터 저장을위한 대체 접근법 사용을 고려할 수도 있습니다. Java의 기본 이진 직렬화는 매우 약합니다. XML, JSON 또는 YAML과 같은 텍스트 기반 형식이나 프로토콜 버퍼 또는 쓰레드와 같은 이진 형식이 많이 있습니다.

+0

감사합니다 ... 회신하여 도움을주십시오. – staigoun