【问题标题】:GAE/J Memcache : Cannot use as a keyGAE/J Memcache:不能用作键
【发布时间】:2012-12-03 16:48:16
【问题描述】:

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

【问题讨论】:

  • 还有其他细节吗?例如:代码?
  • 代码很简单,见我上面的编辑。

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


【解决方案1】:

也许我明白了,下面是 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();
     }

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2011-12-26
    • 2012-07-10
    • 2011-07-25
    • 2012-06-08
    相关资源
    最近更新 更多