0

GAE 文档说:

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 );
...
4

1 回答 1

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();
     }
于 2012-12-17T12:40:39.287 回答