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 );
...
答案 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();
}