0

Memcached クライアントでオブジェクト (シリアル化可能) のリストを設定しようとしています。set メソッドを使用して実行しています。次のエラー メッセージが表示されます。

ターゲット VM で例外が発生しました: シリアル化できないオブジェクト

MemcachedClientしたがって、オブジェクトに値を設定することはできません。これが私のコードです:

MemcachedClient client = CacheConnectionUtil.connectToCacheServer(this.applicationEnv);
client.set(generateCacheKey(namespace, key), expireInSeconds, value);
// value is a list of objects that implements serializable

このエラー メッセージが表示されるのはなぜですか?

4

4 に答える 4

4

javadocからSerializable:

グラフをトラバースするときに、インターフェイスをサポートしていないオブジェクトに遭遇する場合がありSerializableます。この場合、NotSerializableExceptionがスローされ、シリアル化できないオブジェクトのクラスを識別します。

Memcached は残りの例外メッセージを隠しているように見えるため、シリアル化できないオブジェクトを自分で特定する必要があります。

あなたはそれvaluesがあなた自身のオブジェクトのリストだと言います。私の推測では、あなたのオブジェクトは ではないものを保持しているか、 ではないものを保持Serializableしている何かを保持してSerializableいます。リスト内のオブジェクトのクラスを調べて、その下にあるすべてのオブジェクトが を実装していることを確認してくださいSerializable

例として、Aimplementsがある場合Serializable:

public class A implements Serializable {
    private B b;
    // ...
}

そしてBしません:

public class B { ... }

次に、 (おそらくMemcachedライブラリのデフォルトのシリアライザーが行っていることです)をA使用してシリアル化しようとすると、 a がスローされます。これは、そのフィールドがシリアル化できないタイプであるためです。ObjectOutputStreamNotSerializableExceptionprivate B b

于 2012-10-06T18:20:53.503 に答える
1

オブジェクトが実装されていることを確認しますSerializable(さらに、オブジェクトから参照されるすべてのオブジェクトも)

于 2012-10-06T17:56:00.283 に答える
0

リストのシリアル化に関して同様の問題がありました。私の問題は、List.subList を使用していたことであることが判明しました。List にはシリアル化可能なアイテムしか含まれていませんが、subList によって返された List はシリアル化できませんでした。簡単な解決策は、次のようなことをすることでした

List mySublist = new ArrayList().addAll(originalList.subList(...));
于 2013-11-25T11:47:45.710 に答える