Appengine Key сериализует временный appIdNamespace

1

Я создаю com.google.appengine.api.datastore.Key в пространстве имен A и добавляю его как поле в DeferredTask для запуска в другом пространстве имен B Затем эта задача отправляется в очередь и выполняется в другом поле.

Поскольку он создается в пространстве имен A, этот ключ имеет A как исходное значение пространства имен (в поле appIdNamespace).

Но поскольку ключевое поле appIdNamespace является временным, а DeferredTask использует сериализацию, я ожидаю, что поле appIdNamespace будет нулевым при десериализации (и, таким образом, чтобы инициализировать значение пространства имен B) при запуске из пространства имен B

Но вместо этого ключ все еще имеет значение A для пространства имен в своем поле appIdNamespace после десериализации, когда задача выполняется в пространстве имен B

Я уверен, что здесь что-то не хватает, но не могу объяснить. Что мне здесь не хватает?

  • 0
    Процесс сериализации может быть переопределен для Key который также сериализует appIdNamespace .
Теги:
google-app-engine
google-cloud-datastore
objectify

1 ответ

1
Лучший ответ

Да, я только что проверил. Процесс Serialization переопределяется для Key который сериализует appIdNamespace если он не appId null через поле appId которое не является transient:

private void writeObject(ObjectOutputStream out) throws IOException {
    if (appIdNamespace != null) {
      appId = appIdNamespace.toEncodedString();
    }
    out.defaultWriteObject();
}

И readObject() правильно декодирует appIdNamespace из десериализованного поля appId:

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    if (appId != null) {
        appIdNamespace = AppIdNamespace.parseEncodedAppIdNamespace(appId);
        appId = null;
    } else {
        appIdNamespace = new AppIdNamespace(DatastoreApiHelper.getCurrentAppId(), "");
    }
    validateAppIdNamespace(parentKey, appIdNamespace);
}

Источник: Key.java

  • 0
    Спасибо, это объясняет тайну. Теперь имеет смысл. Хотя комментарий будет полезен в документации, чтобы предупредить об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню