我在命名空间com.google.appengine.api.datastore.Key
中创建A
并将其作为字段添加到DeferredTask
以在不同的命名空间B
中运行。然后该任务被发送到队列并在另一个盒子上执行。
因为,它在名称空间A中创建,该密钥具有A
作为其原始名称空间值(在其appIdNamespace
字段中)。
但由于密钥的appIdNamespace
字段是瞬态的,DeferredTask
使用序列化,我希望反序列化时appIdNamespace
字段为空(因此初始化为{{1}的命名空间值1}})从名称空间B
运行时。
但是,当反序列化后,当任务在命名空间B
中运行时,密钥在其A
字段中仍然具有appIdNamespace
作为名称空间的值。
我确信我在这里遗漏了一些东西,但无法解释。我在这里缺少什么?
答案 0 :(得分:1)
是的,我刚检查过。 Key
的序列化过程被覆盖,appIdNamespace
如果null
未通过appId
字段transient
序列化private void writeObject(ObjectOutputStream out) throws IOException {
if (appIdNamespace != null) {
appId = appIdNamespace.toEncodedString();
}
out.defaultWriteObject();
}
1}}:
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);
}
:
{{1}}
来源:Key.java