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

标签 java android serialization linkedhashmap

所以我想将 LinkedHashMap 传递给一个 Intent 。

//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 没有错误。

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

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

最佳答案

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

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

你有两个选择:

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

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

更新

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

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

关于java - 序列化/反序列化 LinkedHashMap (android) java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890346/

相关文章:

java - com.hazelcast.nio.serialization.HazelcastSerializationException

JAVA 无法在 main from 方法中访问我的数组

java - 从我的 Java 工具启动执行 .exe

java - Spring 3.0 : Unable to locate Spring NamespaceHandler for XML schema namespace

android - "InputType"的 "EditText"在java代码中如何设置只能由 "0123456789"和 "."输入

c# - 在 Protobuf-net 中序列化一个抽象列表

java - 奥利奥 Wifi 热点创建失败

android - 获取空 SearchView

android - GPS android requestLocationUpdates

serialization - 在 protobuf 消息中存储单个字节