2011-05-08 2 views
2

내 GWT 앱이 Google App Engine for Java에 배포되었습니다. 앱 엔진 데이터 저장소에 클래스의 인스턴스를 유지했습니다. 이제이 클래스를 다른 패키지로 옮기고 싶지만 기존 객체를 deserialize 할 때 문제가 발생합니다.Google App Engine - 영구 클래스 용 패키지 변경

그래서 클래스를 새 패키지로 이동할 수있는 방법이 있습니까? 기존 목표를 달성하는 데 도움이된다면 기존 목표를 업데이트해도 상관 없습니다.

감사합니다.

+0

무슨 문제입니까? 직렬화 해제 하시겠습니까? Stacktrace 제발! –

답변

2

이것은 my.package.Clazz를 my로 옮기는 방법입니다. 신품 .package.Clazz. 기본적인 아이디어는 세 번째 "일시적으로"클래스 (이 경우 TempClazz)를 통해 마이그레이션을하는 것입니다 :

  • 새로운 클래스 my.package.TempClazz (단순히 이름을 변경하지 마십시오 clazz에)

  • 생성을 만들 기존의 모든 Clazz 엔티티를 데이터 저장소에서 읽은 다음 데이터를 새 TempClazz 인스턴스에 복사하고 데이터 저장소에 TempClazz 엔티티를 저장하는 도우미 메서드.

  • 이제는 GAE에 배포하고 Helper 메서드를 실행하여 Clazz 엔터티를 TempClazz 엔터티에 복사합니다.

  • 해당되는 경우. Clazz 엔티티를 삭제합니다.

  • 다음은 기본적으로 my.package.Clazz를 새 패키지 my로 리팩터링하는 것을 제외하고는 프로세스를 반복합니다. 신품 .package.Clazz. 그래서이 시점에서 my.package.TempClazz와 my. 신품 .package.Clazz.

  • 나머지는 데이터 저장소에서 TempClazz를 읽고 Clazz 엔티티로 각각 복사하는 것입니다.

꽤 복잡합니다. 어쩌면 누군가가 더 쉬운 방법을 알고 있을까요?

+0

새 패키지에 정의를 복제하고 이전 엔티티에서 새 엔티티로 직접 엔티티를 복사하지 않는 이유는 무엇입니까? –

+1

@ 닉, 시도해 봤어? 제안이 효과가 있다면 OP가 왜 새로운 클래스를 사용하여 기존 엔터티를 비 직렬화하는 데 문제가 있는지 이해할 수 없습니다. 문서에서는 엔티티 키가 클래스의 단순한 이름에서 파생된다는 것을 설명하므로 같은 클래스 이름으로 다른 엔티티를 유지/검색하려고하면 상처를 입는다 고 가정했습니다. Cf. http://code.google.com/intl/de-DE/appengine/docs/appa/datastore/jdo/dataclasses.html#Class_and_Field_Annotations – Stefan

+0

더 많은 조사가 진행 중입니다. 결과를 알려 드리겠습니다. 어떤 경우에는 deserialization 및 다른 사람들에게 문제가 있다는 것을 알게되었습니다. 예를 들어, 클래스 C 타입의 영속 필드가있는 영속 ClassA가 있습니다. 클래스 C를 com.dfb.client.ClassC -> com.dfb.shared.ClassC에서 옮기면 "com.dfb.client.ClassC"가 없다는 것을 나타내는 직렬화 오류가 발생합니다. 철저한 분석을하고 정확한 결과를보고하겠습니다. 당신의 도움을 주셔서 감사합니다. – DFB