序列化/反序列化 LinkedHashMap (android) java

2024-04-29

所以我想将 LinkedHashMap 传递给意图。

//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);

//GET THE MAP
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>();   
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

这个与 HashMap 一起工作就像一个魅力。 但是使用 LinkedHashMap 我遇到了一个问题,我在这里遇到了运行时错误

  db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");

我在使用 HashMap 时没有遇到任何错误。

我还收到警告“类型安全:从 Serialized 到 LinkedHashMap 的未经检查的转换” 但我对 HashMap 也有这个警告。 任何想法。非常感谢任何帮助

我也是刚刚看到这个。https://issues.apache.org/jira/browse/HARMONY-6498 https://issues.apache.org/jira/browse/HARMONY-6498


这里问题的根源是您试图将类型转换为泛型类型。如果没有不安全/未经检查的类型转换,这是无法完成的。

泛型类型的运行时类型是原始类型;即类型参数的实际类型未知的类型。在这种情况下,运行时类型将是LinkedHashMap<?, ?>。这不能安全地类型转换为LinkedMashMap<String, String>因为运行时系统无法知道所有键和值实际上都是String实例。

您有两个选择:

  • 您可以添加注释来告诉编译器“关闭”未经检查的强制转换。这有点冒险。如果由于某种原因键或值之一实际上不是字符串,您的应用程序may稍后得到一个ClassCastException在一个完全意想不到的地方;例如在迭代键或分配 a 的结果时get.

  • 您可以手动复制反序列化的Map<?, ?>进入一个新的LinkedMashMap<String, String>,将每个键和值显式转换为String.

UPDATE

显然,运行时异常的真正原因(与“不安全类型转换”编译错误不同)是 Android 传递了serializedExtra作为常规的意图之间HashMap而不是使用Map您提供的课程。此处对此进行了描述:

  • 将 LinkedHashMap 发送到意图 https://stackoverflow.com/questions/4164050/sending-linkedhashmap-to-intent/38960732#38960732.

正如该问答所解释的那样,没有简单的解决方法。如果您想传递保留键顺序的映射,则必须将映射转换为对数组并传递它。另一方面,您需要根据传递的数组重建地图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化/反序列化 LinkedHashMap (android) java 的相关文章

随机推荐