Я создаю com.google.appengine.api.datastore.Key
в пространстве имен A
и добавляю его как поле в DeferredTask
для запуска в другом пространстве имен B
Затем эта задача отправляется в очередь и выполняется в другом поле.
Поскольку он создается в пространстве имен A, этот ключ имеет A
как исходное значение пространства имен (в поле appIdNamespace
).
Но поскольку ключевое поле appIdNamespace
является временным, а DeferredTask
использует сериализацию, я ожидаю, что поле appIdNamespace
будет нулевым при десериализации (и, таким образом, чтобы инициализировать значение пространства имен B
) при запуске из пространства имен B
Но вместо этого ключ все еще имеет значение A
для пространства имен в своем поле appIdNamespace
после десериализации, когда задача выполняется в пространстве имен B
Я уверен, что здесь что-то не хватает, но не могу объяснить. Что мне здесь не хватает?
Да, я только что проверил. Процесс 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
Key
который также сериализуетappIdNamespace
.