序列化SparseArray< T>与GSON序列化、SparseArray、LT、GT

由网友(烟霭)分享简介:我想序列化的自定义Java对象,这样我就可以使用共享preferences 来储存和retreive在另一个活动。我并不需要持续性的存储,在共享preferences ,我擦干时,我的应用程序关闭。我目前使用GSON这一点,但它似乎并没有与Android的SparseArray类型的工作。我的对象:公共类PartPro...

我想序列化的自定义Java对象,这样我就可以使用共享preferences 来储存和retreive在另一个活动。我并不需要持续性的存储,在共享preferences ,我擦干时,我的应用程序关闭。我目前使用GSON这一点,但它似乎并没有与Android的SparseArray类型的工作。

我的对象:

 公共类PartProfile {

私人诠释gameId;
//一些更多元
私人SparseArray<部分> installedParts =新SparseArray<部分>();

// ...
}

公共类部分{
   私人字符串零件名称;
   //更多元
}
 

连载:

 键入genericType =新TypeToken< PartProfile>(){} .getType();
字符串serializedProfile = Helpers.serializeWithJSON(installedParts,genericType);
。preferences.edit()putString(零部件,serializedProfile).commit();
 

serializeWithJSON():

 公共静态字符串serializeWithJSON(对象o,类型genericType){
    GSON GSON =新GSON();
    返回gson.toJson(O,genericType);
}
 
LTC1645 双路热插拔控制器 电源序列发生器

反序列化:

 键入genericType =新TypeToken< PartProfile>(){} .getType();
PartProfile部分= gson.fromJson(preferences.getString(零部件,PARTS_ERROR),genericType);

SparseArray<部分> retreivedParts = parts.getInstalledParts();
INT关键;
的for(int i = 0; I< retreivedParts.size();我++){
    键= retreivedParts.keyAt(我);
    //异常这里:
    部件部件= retreivedParts.get(密钥);
    // ...
}
 

例外:

  java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap不能转换为com.mypackage.objects.Part
 

我不明白为什么GSON希望蒙上了 LinkedTreeMap 来我的目标,我从来没有使用一个在我的整个程序。我曾经有一个的HashMap<整数,部分> 之前,我切换到 SparseArray<部分> ,和从未有过问题的。不支持SparseArrays由GSON,或者是有一个错误在我的身边?

编辑:看来,SparseArray被正确地内反序列化,而不是对象。相反 LinkedTreeMaps ,这些应该是类型部分

解决方案   

看来,SparseArray被正确地反序列化,而不是   对象内。相反LinkedTreeMaps,这些应该是类型   部分。

您的观察是正确的,因为 SparseArray包含对象(而不是部分),GSON不会有任何线索,使部分作为对象类型。因此,它映射你的列表作为其臭名昭著的内部类型 LinkedTreeMap

要解决这个问题,我想你将无法使用 SparseArray ...或者你可以尝试 retreivedParts.get(钥匙)的ToString(),然后用GSON再次解析的对象。但我不认为这是有效的做到这一点。

I want to serialize a custom Java object, so I can use SharedPreferences to store it and retreive it in another Activity. I don't need persistant storage, the SharedPreferences, I wipe them when my application is closed. I'm currently using GSON for this, but it doesn't seem to work well with Android's SparseArray type.

My objects:

public class PartProfile {

private int gameId;
// Some more primitives
private SparseArray<Part> installedParts = new SparseArray<Part>();

// ...
}

public class Part {
   private String partName;
   // More primitives
}

Serialization:

Type genericType = new TypeToken<PartProfile>() {}.getType();
String serializedProfile = Helpers.serializeWithJSON(installedParts, genericType);
preferences.edit().putString("Parts", serializedProfile).commit();

serializeWithJSON():

public static String serializeWithJSON(Object o, Type genericType) {
    Gson gson = new Gson();
    return gson.toJson(o, genericType);
}

Deserialization:

Type genericType = new TypeToken<PartProfile>() {}.getType();
PartProfile parts = gson.fromJson(preferences.getString("Parts", "PARTS_ERROR"), genericType);

SparseArray<Part> retreivedParts = parts.getInstalledParts();
int key;
for (int i = 0; i < retreivedParts.size(); i++) {
    key = retreivedParts.keyAt(i);
    // Exception here:
    Part part = retreivedParts.get(key);
    // ...
}

Exception:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part

I don't understand why Gson wants to cast a LinkedTreeMap to my object, I never use one in my entire program. I used to have a HashMap<Integer,Part> before I switched to the SparseArray<Part>, and never had issues with that. Are SparseArrays not supported by Gson, or is there an error on my side?

Edit: It seems that the SparseArray gets deserialized correctly, but not the objects inside. Instead of LinkedTreeMaps, these should be of type Part.

解决方案

It seems that the SparseArray gets deserialized correctly, but not the objects inside. Instead of LinkedTreeMaps, these should be of type Part.

Your observation is correct, since SparseArray contains Object (not Part), Gson won't have any clue to make Part as your object type. Hence it map your list as its infamous internal type LinkedTreeMap.

To solve it, I think you won't be able to use SparseArray... Or you may try retreivedParts.get(key).toString(), then use gson to parse the object again. But I don't think it's efficient to do that

阅读全文

相关推荐

最新文章