2

我有一个Event类定义了HashMap这样的私有:

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

该类Event是任何类型的“事件”的包装。这HashMap可以包含键引用的任何对象实例。接收Event实例的类知道与每个键相关的类,因此它可以安全地将其Object转换为相应的子类。

当我尝试Event在 2 个进程之间传递一个实例时,就会出现问题。Event实现Parcelable,因此它可以通过 a 发送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异常。

  • 传递一些额外的信息,这样我就可以知道HashMap. 除了这看起来是冗余信息之外,仍然不行,因为如果我在 Bundle 上设置一个类加载器,它仍然会ClassNotFound在其他类上抛出异常......

我真的很感激在这个问题上的一些帮助。提前致谢!

4

2 回答 2

1

其实回答了我的问题。我必须获得对我的 ClassLoader 的引用,然后将其设置为反序列化,我认为这是通过另一个线程完成的,可能是系统线程,因此它不知道我的类。

于 2012-07-16T14:36:34.037 回答
0

我认为最好的解决方案是重新考虑您的计划,以拥有对象的哈希图并根据哈希图中的键将它们转换为真实对象。

通过这样做,您将不会真正利用 java 为您提供的类型安全性,并且您还将从 HashMap 中获得额外的开销。

相反,我建议将事件实现为接口,并让每种类型的事件都实现该接口。

这样,类中的“数据”变量可以用描述性名称重命名(这使代码更易于阅读),并且您不必存储任何冗余数据。

于 2012-07-16T12:15:36.353 回答