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は、Serializable を実装した apache commons-collections からのものです。

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

多分私はアイデアを得ました、以下はキーをシリアル化する方法です。オブジェクトをバイト配列に書き込むだけなので、キーに含まれるオブジェクトの1つ(私の状況では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 に答える