Appengine Key序列化瞬态appIdNamespace

时间:2014-08-06 08:32:17

标签: java google-app-engine objectify google-cloud-datastore

我在命名空间com.google.appengine.api.datastore.Key中创建A并将其作为字段添加到DeferredTask以在不同的命名空间B中运行。然后该任务被发送到队列并在另一个盒子上执行。

因为,它在名称空间A中创建,该密钥具有A作为其原始名称空间值(在其appIdNamespace字段中)。

但由于密钥的appIdNamespace字段是瞬态的,DeferredTask使用序列化,我希望反序列化时appIdNamespace字段为空(因此初始化为{{1}的命名空间值1}})从名称空间B运行时。

但是,当反序列化后,当任务在命名空间B中运行时,密钥在其A字段中仍然具有appIdNamespace作为名称空间的值。

我确信我在这里遗漏了一些东西,但无法解释。我在这里缺少什么?

1 个答案:

答案 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