GAE / J Memcache:不能用作密钥

时间:2012-12-16 08:39:48

标签: java google-app-engine memcached apache-commons-collection

GAE doc说:

Keys and values can be of any Serializable type or class

我使用MultiKey作为密钥但在更新我的应用后,它给了我例外:

java.lang.IllegalArgumentException: Cannot use as a key: 'MultiKey[class com.xx.xx.xx, Key<?>(Domain("xxx.com")/AppUser(2001)), -1, {}, [-lastModified, ]]'
    at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.makePbKey(AsyncMemcacheServiceImpl.java:251)
    at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.doGet(AsyncMemcacheServiceImpl.java:294)
    at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl.get(AsyncMemcacheServiceImpl.java:306)
    at com.google.appengine.api.memcache.MemcacheServiceImpl.get(MemcacheServiceImpl.java:49)

MultiKey来自apache commons-collections,它实现了Serializable

public class MultiKey
extends java.lang.Object
implements java.io.Serializable

有什么想法吗?

感谢。

编辑,代码如下:

MemcacheService ms = MemcacheServiceFactory.getMemcacheService();
MultiKey key=new MultiKey(xx, xx, xx...);
ms.put( key, value );
...

1 个答案:

答案 0 :(得分:0)

也许我有了这个想法,下面是gae如何序列化密钥,它只是将对象写入字节数组,所以如果密钥中包含的一个对象(在我的情况下是MultiKey)没有实现Serializable,这个方法将会不工作并抛出异常,这只是我的情况。

     } else if (value instanceof Serializable) {
          flags = Flag.OBJECT;
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream objOut = new ObjectOutputStream(baos);
          objOut.writeObject(value);
          objOut.close();
          bytes = baos.toByteArray();
     }