2

私はこのようなEventプライベートを定義するクラスを持っていますHashMap

private Map<String, Object> data = new HashMap<String, Object>();

Eventクラスは、あらゆる種類の「イベント」のためにラップされています。これHashMapには、キーによって参照される任意のオブジェクトインスタンスを含めることができます。インスタンスを受け取るクラスは、Eventどのクラスが各キーに関連しているかを知っているためObject、対応するサブクラスに安全にキャストできます。

Event2つのプロセス間でインスタンスを渡そうとすると、問題が発生します。Eventを実装して、 :Parcelableを介して送信できるようにします。Message

Bundle bundle = new Bundle();
bundle.putParcelable(Event.BUNDLE_KEY, event);

// Make the message with the bundle
Message message = new Message();
message.setData(bundle);

マーシャリングを解除する場合:

public void readFromParcel(Parcel in) {

    idEvent = in.readInt();
    priority = in.readInt();
    idSource = in.readInt();
    idDestination = in.readInt();
    action = in.readInt();

    Bundle mapBundle = in.readBundle();

    if (mapBundle.getSerializable(MAP_KEY) instanceof HashMap) {
        data = (Map<String, Object>) mapBundle.getSerializable(MAP_KEY);
    } else {
        Log.e(TAG, "Parcel reading error: not a HashMap");
    }
}

問題は、mapBundleどちらClassLoaderを使用するかを指定する必要があるため、これが機能しないことmapBundle.setClassLoader(Entity.class.getClassLoader());です。しかしObject、どのサブクラスが含まれるのかわかりませんHashMap...

これは私が思ったことです:

  • ClassLoaderこれらのクラスのいずれかをロードするを記述します。byte[]問題は、オブジェクトが。内にあるため、オブジェクトを表す方法を取得できないことHashMapです。そしてmapBundle.getSerializable()、それは正確にClassNotFound例外をスローするので、私はそれを取得するために使用することはできません。

  • にあるクラスを知ることができるように、いくつかの追加情報を渡しますHashMapClassNotFoundこれは冗長な情報のように見えますが、バンドルに1つのクラスローダーを設定すると、他のクラスにも例外がスローされるため、まだ問題はありません...

この問題について助けていただければ幸いです。前もって感謝します!

4

2 に答える 2

1

実際、これは私の質問に答えます。ClassLoader への参照を取得してから、デシリアライゼーションを設定する必要があります。これは、別のスレッド、おそらくシステム スレッドを介して行われると思われるため、クラスについて認識していません。

于 2012-07-16T14:36:34.037 に答える
0

最善の解決策は、オブジェクトのハッシュマップを持ち、ハッシュマップのキーに応じてそれらを実際のオブジェクトにキャストする計画を再考することだと思います。

これを行うと、Java が提供する型安全性を実際には利用できなくなり、HashMap から余分なオーバーヘッドも発生します。

代わりに、Event をインターフェイスとして実装し、各タイプの Event にそのインターフェイスを実装させることをお勧めします。

そうすれば、クラスの「データ」変数の名前をわかりやすい名前に変更でき (コードが読みやすくなります)、冗長なデータを保存する必要がなくなります。

于 2012-07-16T12:15:36.353 に答える