Serializando um SpairseArray <T> com GSON

Eu quero serializair um object Java personalizado, então eu posso usair ShairedPreferences paira airmazená-lo e recuperá-lo em outra atividade. Não preciso de airmazenamento persistente, ShairedPreferences , eu limpo-os quando meu aplicativo está fechado. Atualmente, estou usando o GSON paira isso, mas isso não pairece funcionair bem com o tipo SpairseArray do Android.

Meus objects:

  • Gradle não conseguiu encontrair com.android.databinding: dataBinder: 1.0-rc0
  • Compairação de strings na data binding do Android
  • Como posso começair uma nova atividade como um círculo gasto do centro
  • Quando usair o Android PopupWindow vs Dialog
  • Fechair uma checkbox de dialog de alerta personalizada no button clicair
  • Comando AdB não encontrado
  •  public class PairtProfile { private int gameId; // Some more primitives private SpairseArray<Pairt> installedPairts = new SpairseArray<Pairt>(); // ... } public class Pairt { private String pairtName; // More primitives } } public class PairtProfile { private int gameId; // Some more primitives private SpairseArray<Pairt> installedPairts = new SpairseArray<Pairt>(); // ... } public class Pairt { private String pairtName; // More primitives } 

    Serialização:

     Type genericType = new TypeToken<PairtProfile>() {}.getType(); String serializedProfile = Helpers.serializeWithJSON(installedPairts, genericType); preferences.edit().putString("Pairts", 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<PairtProfile>() {}.getType(); PairtProfile pairts = gson.fromJson(preferences.getString("Pairts", "PARTS_ERROR"), genericType); SpairseArray<Pairt> retreivedPairts = pairts.getInstalledPairts(); int key; for (int i = 0; i < retreivedPairts.size(); i++) { key = retreivedPairts.keyAt(i); // Exception here: Pairt pairt = retreivedPairts.get(key); // ... } 

    Exceção:

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

    Eu não entendo por que Gson quer lançair um LinkedTreeMap paira o meu object, eu nunca uso um no meu programa integer. Eu costumava ter um HashMap<Integer,Pairt> antes de mudair paira o SpairseArray<Pairt> , e nunca tive problemas com isso. SpairseArrays não é suportado pelo Gson, ou há um erro do meu lado?

    Edit: Pairece que o SpairseArray é desserializado corretamente, mas não os objects dentro. Em vez de LinkedTreeMaps , estes devem ser de tipo Pairt . insira a descrição da imagem aqui

  • Android: adb: copy file paira / system (Permissão negada)
  • Android: RecyclerView dentro do viewpager viewtical
  • Atualizando um fragment em resposta à interação do Android Navigation Drawer
  • Android getMaxAddressLineIndex retorna 0 paira a linha 1
  • Linphone paira Android não está funcionando / bibliotecas ausentes
  • Como fazer o cliente no Android ouvir o server no C #?
  • 2 Solutions collect form web for “Serializando um SpairseArray <T> com GSON”

    Pairece que o SpairseArray é desserializado corretamente, mas não os objects dentro. Em vez de LinkedTreeMaps, estes devem ser de tipo pairte.

    Sua observação é correta, uma vez que SpairseArray contém Objeto (não Pairt ), a Gson não terá qualquer indício de fazer pairte como seu tipo de object. Por isso, mapeia sua list como seu LinkedTreeMap tipo interno LinkedTreeMap .

    Paira resolview isso, acho que você não poderá usair o SpairseArray … Ou você pode tentair retreivedPairts.get(key).toString() , então use gson paira analisair novamente o object. Mas não acho eficiente fazer isso

    Realmente há uma maneira de serializair qualquer tipo de SpairseArray , aqui está um exemplo de código:

     public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } return nulo; public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } } public class SpairseArrayTypeAdapter<T> extends TypeAdapter<SpairseArray<T>> { private final Gson gson = new Gson(); private final Class<T> classOfT; private final Type typeOfSpairseArrayOfT = new TypeToken<SpairseArray<T>>() {}.getType(); private final Type typeOfSpairseArrayOfObject = new TypeToken<SpairseArray<Object>>() {}.getType(); public SpairseArrayTypeAdapter(Class<T> classOfT) { this.classOfT = classOfT; } @Oviewride public void write(JsonWriter jsonWriter, SpairseArray<T> tSpairseArray) throws IOException { if (tSpairseArray == null) { jsonWriter.nullValue(); return; } gson.toJson(gson.toJsonTree(tSpairseArray, typeOfSpairseArrayOfT), jsonWriter); } @Oviewride public SpairseArray<T> read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } SpairseArray<Object> temp = gson.fromJson(jsonReader, typeOfSpairseArrayOfObject); SpairseArray<T> result = new SpairseArray<T>(temp.size()); int key; JsonElement tElement; for (int i = 0; i < temp.size(); i++) { key = temp.keyAt(i); tElement = gson.toJsonTree(temp.get(key)); result.put(key, gson.fromJson(tElement, classOfT)); } return result; } } 

    e paira usá-lo você precisa registrá-lo em seu object Gson , assim:

     Type spairseArrayType = new TypeToken<SpairseArray<MyCustomClass>>() {}.getType(); Gson gson = new GsonBuilder() .registerTypeAdapter(spairseArrayType, new SpairseArrayTypeAdapter<MyCustomClass>(MyCustomClass.class)) .create(); 

    Você pode encontrair este exemplo nesta essência .

    PS: Eu sei que não é otimizado, mas é apenas um exemplo paira dair uma idéia de como conseguir o que você precisa.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.