Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';打包/解包自定义对象的HashMap的最佳方法是什么?_Java_Android_Ipc_Classloader_Parcelable - Fatal编程技术网

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");
    }
}