Java 什么';打包/解包自定义对象的HashMap的最佳方法是什么?
我有一个Java 什么';打包/解包自定义对象的HashMap的最佳方法是什么?,java,android,ipc,classloader,parcelable,Java,Android,Ipc,Classloader,Parcelable,我有一个事件类,它定义了一个私有的HashMap,如下所示: private Map<String, Object> data = new HashMap<String, Object>(); 解组时: public void readFromParcel(Parcel in) { idEvent = in.readInt(); priority = in.readInt(); idSource = in.readInt(); idDe
事件
类,它定义了一个私有的HashMap
,如下所示:
private Map<String, Object> data = new HashMap<String, Object>();
解组时:
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");
}
}
public void readFromParcel(地块中){
idEvent=in.readInt();
优先级=in.readInt();
idSource=in.readInt();
idDestination=in.readInt();
action=in.readInt();
Bundle mapBundle=in.readBundle();
if(mapBundle.getSerializable(MAP_KEY)instanceof HashMap){
data=(Map)mapBundle.getSerializable(Map_键);
}否则{
Log.e(标记,“包裹读取错误:不是哈希映射”);
}
}
问题是这不起作用,因为我需要指定要使用的mapBundle
类加载器,例如mapBundle.setClassLoader(Entity.class.getClassLoader())代码>但是我不知道对象
的HashMap
子类将有什么
我是这样想的:
- 编写一个
ClassLoader
,加载这些类中的任何一个。问题是我无法获得表示对象的字节[]
,因为它位于HashMap
中。我不能使用mapBundle.getSerializable()
来获取它,因为它准确地抛出了ClassNotFound
异常
- 传递一些额外的信息,这样我就可以知道
HashMap
上有哪些类。除此之外,这看起来像是冗余信息,仍然不可行,因为如果我在Bundle上设置一个classloader,它仍然会在其他类上抛出一个ClassNotFound
异常
在这个问题上,我非常感谢你的帮助。提前谢谢 我认为最好的解决方案是重新考虑使用对象的hashmap的计划,并根据hashmap中的键将它们转换为真实对象
通过这样做,您将不会真正利用java为您提供的类型安全性,并且您还将从HashMap中获得额外的开销
相反,我建议将事件实现为接口,并让每种类型的事件实现该接口
这样,类中的“data”变量可以用描述性名称重命名(这使代码更易于阅读),并且您不必存储任何冗余数据。我认为最好的解决方案是重新考虑使用对象的hashmap的计划,并根据hashmap中的键将它们转换为真实对象
通过这样做,您将不会真正利用java为您提供的类型安全性,并且您还将从HashMap中获得额外的开销
相反,我建议将事件实现为接口,并让每种类型的事件实现该接口
这样,类中的“data”变量就可以用描述性名称重命名(这使代码更易于阅读),并且不必存储任何冗余数据。实际上回答了我的问题。我必须获得对我的类加载器的引用,然后将其设置为反序列化,我认为这是通过另一个线程完成的,可能是系统线程,因此它不知道我的类。实际上回答了我的问题。我必须获得对我的类加载器的引用,然后将其设置为反序列化,我认为这是通过另一个线程完成的,可能是系统线程,因此它不知道我的类。hashmap中使用的类也应该实现ParcelableIt。这不是问题所在。问题是ClassNotFound,而不是Parcelable异常。hashmap中使用的类也应该实现ParcelableIt。这不是问题所在。问题是ClassNotFound,不是可包裹异常。嗯。。。请记住,每个事件可以有几个完全不同的属性。这也意味着需要在这些事件中的每一个上实现Parcelable。这也意味着,如果以后设计新事件(这是很可能的),我必须创建这样的类,这将彻底破坏向后兼容性。此外,我认为没有比数据
更好的名称了,因为它就是:未知数据<代码>事件
类不关心其中包含的内容。也许您可以编写一个包装器,在决定是否解包之前查看包裹,如果它得到一个包含某种查找表中没有的idEvent的包裹,它会丢弃该包裹?决定是否解包?我为什么要寄一些我不想拆开的东西?对不起,我没有在这里跟踪你。。。问题是HashMap本身是可序列化的,当我想要获取它时,它会抛出ClassNotFound异常,因此我甚至无法获取我想要的包…很抱歉我不清楚,我的意思是,如果程序的较新版本向较旧版本发送某个内容,那么较旧版本不知道如何处理该事件,我们需要忽略它,但你的方法就不那么简单了。例如,一个新事件将需要一个新类,但该类在旧版本上不可用。程序如何知道问题是加载类还是类实际上不存在。。。请记住,每个事件可以有几个完全不同的属性。这也意味着需要在这些事件中的每一个上实现Parcelable。这也意味着,如果以后设计新事件(这是很可能的),我必须创建这样的类,这将彻底破坏向后兼容性。此外,我认为没有比数据
更好的名称了,因为它就是:未知数据<代码>事件类不关心其中包含的内容。也许您可以编写一个包装器,在决定是否解包之前查看包裹,如果它得到一个包含某种查找表中没有的idEvent的包裹,它会丢弃该包裹?决定是否解包?我为什么要寄一些我不想拆开的东西?对不起,我没有在这里跟踪你。。。问题是HashMap本身是一个可序列化的,当我想要得到它时,它抛出
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");
}
}