【发布时间】:2012-07-16 12:08:20
【问题描述】:
我有一个 Event 类,它定义了一个私有 HashMap,如下所示:
private Map<String, Object> data = new HashMap<String, Object>();
Event 类是为任何类型的“事件”包装的。这个HashMap 可以包含键引用的任何对象实例。接收Event 实例的类知道与每个键相关的类,因此它可以安全地将Object 转换为其对应的子类。
当我尝试在 2 个进程之间传递 Event 实例时出现问题。 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异常。传递一些额外信息,以便我知道
HashMap上的课程。除了这看起来是多余的信息之外,仍然不行,因为如果我在 Bundle 上设置一个类加载器,它仍然会在其他类上抛出ClassNotFound异常......
我非常感谢在这个问题上提供一些帮助。提前致谢!
【问题讨论】:
-
hashmap中使用的类也应该实现Parcelable
-
确实如此。那不是问题。问题是 ClassNotFound,而不是 Parcelable 异常。
标签: java android ipc classloader parcelable