2012-10-24 3 views
3

Serailizable이 아닌 엔터티에 대한 중요한 상태 데이터를 저장할 Serializable 개체 설명자를 생성합니다. 이전 디스크립터를 응용 프로그램 업그레이드 전체에서 어떻게 유효하게 유지합니까? 나는 이전의 모든 상태를 (업그레이드시) 열어서 상태를 업그레이드하라는 메시지를 전했습니다. 아마도 통해 :직렬화 된 객체를 어떻게 유지해야합니까?

void onUpgrade(int oldVersion, int newVersion, int updateFlags); 

그러나 이것은 직렬화 유지 관리를위한 좋은 방법인지 모르겠습니다.

+1

다음은 직렬화에 대한 훌륭한 기사입니다 : http://www.javaworld.com/javaworld/jw-02-2006/jw-0227-control.html, 5 페이지에있는 내용은 InvalidClassException 잡기와 관련이 있습니다. 예외 처리. 다른 접근법은 JSON, XML 또는 심지어 설명자 테이블과 같은 메타 데이터로 동적 데이터와 구조를 사용하여 변경 사항을 관리하는 방법을 포함합니다. 희망을 도왔습니다. – eduardohl

+0

@eduardohl 실제로 많은 도움이되었습니다. 링크를 제공해 주셔서 감사 드리며 조금만 기어 가려면 기꺼이 교육을 받아야합니다. – AedonEtLIRA

+0

이 기사에는 심각한 실수가 있습니다. 예를 들어, 필드 제거에 대한 IllegalArgumentException에 대한 설명은 환상적입니다. 기본적으로 serialVersionUID를 절대로 변경하지 말고 결코 호환되지 않는 변경을하지 말라고 말하는 Sun의 기사가 있습니다. – EJP

답변

3

외부 표현을위한 또 다른 형식을 제안합니다. 직렬화 된 객체는 이미 언급했듯이 호환성을 유지하기가 어렵습니다. jaxb 주석을 사용하여 객체에 주석을 달고 Jaxb를 사용하여 읽기/쓰기하는 것이 가장 쉬운 방법입니다.

1

개체 버전 관리의 어려움은 일반적으로 지나치게 과장됩니다. 가장 좋은 점은 당신이 할 수있는 일과 할 수없는 일을 알기 시작하는 것입니다. 객체 직렬화 사양의 개체 버전 관리 섹션에서 규칙에서 정말 좋은 모습을 가지고 있고, 종교적을 따르

  • 이 상속을 변경하지 마십시오;
  • 필드의 데이터 유형을 변경하지 마십시오.
  • 필드를 더하거나 뺄 수 없습니다.
  • never serialVersionUID를 변경하십시오.

충분하지 않은 경우 writeReplace()/readResolve() 메커니즘 및/또는 serializableFields 메커니즘을 사용할 준비가되어 있어야합니다.

+0

writeReplace()/readResolve() 메커니즘은 무엇입니까? 나는 전에 그것을 사용하지 않았다. – AedonEtLIRA

+0

@AedonEtLIRA 모두 [Object Serialization Specification] (http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html)에 설명되어 있습니다. 물론 프로토콜 부록을 제외하고. 그러나 당신이 지금까지 가야만한다면, JavaWorld 기사에 설명 된 예외적 인 속임수는 물론, 미친 사람에 의해서만 시도 될 것입니다. – EJP

관련 문제