2011-05-08 2 views
2

Приложение GWT развернуто в Google App Engine для Java. Я сохранял экземпляры класса в хранилище данных приложения. Теперь я хочу переместить этот класс в другой пакет, но это приводит к проблемам при десериализации существующих объектов.Google App Engine - изменение пакета для постоянного класса

Итак, есть ли способ переместить класс в новый пакет? Я не против обновления существующих объектов, если это поможет мне достичь моей цели.

Спасибо.

+0

Какая «проблема» вы получаете десериализацию? Stacktrace, пожалуйста! –

ответ

2

Вот как бы я переместил my.package.Clazz к моему. новый товар .package.Clazz. Основная идея заключается в том, чтобы сделать миграцию через третью «временный» класс (TempClazz в данном случае):

  • создать новый класс my.package.TempClazz (не просто переименовывать Clazz)

  • создать вспомогательный метод, который будет считывать все существующие объекты Clazz из хранилища данных, а затем копировать данные в новый экземпляр TempClazz и хранить объекты TempClazz в хранилище данных.

  • теперь развертывается в GAE и запускает вспомогательный метод для копирования ваших объектов Clazz в объекты TempClazz.

  • если это сработало. Удалить объекты Clazz.

  • следующий, в основном повторите этот процесс, за исключением того, что на этот раз вы фактически реорганизуете my.package.Clazz в новый пакет my. новый товар .package.Clazz. Итак, на этом этапе у вас будет два класса: my.package.TempClazz и мой. новый товар .package.Clazz.

  • все, что осталось сделать, это снова прочитать TempClazz из хранилища данных и скопировать их в Clazz-entity.

Pretty involved. Может быть, кто-то знает более простой способ?

+0

Почему бы просто не дублировать определение в новом пакете и копировать объекты напрямую из старого в новый? –

+1

@ Ник, ты это пробовал? Если ваше предложение работает, я не понимаю, почему OP испытывает проблемы при десериализации существующих объектов, использующих новый класс в первую очередь. В документах указано, что сущность-ключ получен из простого имени класса, и поэтому я предположил, что попытка сохранить/получить разные объекты с тем же именем класса - это мешок с болью. Ср http://code.google.com/intl/de-DE/appengine/docs/java/datastore/jdo/dataclasses.html#Class_and_Field_Annotations – Stefan

+0

Я делаю еще несколько исследований и вернусь к результатам. Я вижу, что в некоторых случаях у меня проблема в десериализации, а в других - нет. Например, у меня есть постоянный ClassA, который имеет постоянное поле типа ClassB, которое также имеет постоянное поле типа ClassC. Если я перемещаю класс C из com.dfb.client.ClassC -> com.dfb.shared.ClassC, я получаю ошибку десериализации, в которой «com.dfb.client.ClassC» не найден (или что-то подобное). Позвольте мне провести тщательный анализ и сообщить о результатах. Спасибо за вашу помощь. – DFB

Смежные вопросы