Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Problemas de serialización de RealmList (Realm / Gson / Intent)

Utilizo Retrofit, Gson y Realm en mi proyecto. Tengo esta clase Example que necesita ser Serializable . Sin Reino lo escribiría así:

 public class Example implements Serializable { @SerializationName("users") private List<String> users //... getters and setters } 

Realm entra en juego y Example convierte en (note que getters y setters son así por razones de compatibilidad):

 public class Example extends RealmObject implement Serializable { @SerializedName("users") private RealmList<RealmString> users; public ArrayList<String> getUsers() { ArrayList<String> array = new ArrayList<>(); for (RealmString rs : users) { array.add(rs.getValue()); } return array; } public void setUsers(ArrayList<String> users) { RealmList<RealmString> array = new RealmList<>(); for (String rs : users) { array.add(new RealmString(rs)); } this.users = array; } } 

Siendo RealmString:

 public class RealmString extends RealmObject implements Serializable { private String val; //Constructors, getter and setter } 

Y agregue un convertidor personalizado del tipo de Gson para que se deserialice correctamente:

 public class RealmStringRealmListConverter implements JsonSerializer<RealmList<RealmString>>, JsonDeserializer<RealmList<RealmString>> { @Override public JsonElement serialize(RealmList<RealmString> src, Type typeOfSrc, JsonSerializationContext context) { JsonArray ja = new JsonArray(); for (RealmString tag : src) { ja.add(tag.getValue()); } return ja; } @Override public RealmList<RealmString> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { RealmList<RealmString> tags = new RealmList<>(); JsonArray ja = json.getAsJsonArray(); for (JsonElement je : ja) { if (je.isJsonPrimitive()) { tags.add(new RealmString(je.getAsString())); } } return tags; } } 

Ok, ahora empezamos a sentir que Realm está empezando a tener un gran impacto sobre nuestro código. Pero eso es un problema lateral, el principal problema es que el ejemplo ya no es Serializable: RealmList no lo es.

Así que traté de hacer la RealmList transitorio y tener su pendiente Lista que puedo anotar con @ Ignore, y volver a crear la RealmList después de la serialización. Pero Transitorio no es aceptado por el Reino.

Ahora me siento un poco atascado, Example se pasa a través de intenciones en numerosas partes de mi código (es un miembro de un montón de clases). No quiero usar un id y consultarlo en todas partes.

Mi pregunta sería:

¿Cómo puedo cambiar Example` de una manera que me permite hacer new Bundle().putSerializable("test", new Example()); Sin accidente.

Gracias por ayudar !

  • ¿Cómo puedo hacer una petición Volley JSONObject con un objeto personalizado como parámetro?
  • Guardar matriz de objetos personalizados en estado de instancia
  • JSONObject no serializable?
  • Cómo pasar el objeto serializado gson a Intent en android?
  • Guardar / cargar el estado del documento de forma rápida y robusta para el editor de imágenes
  • Java.io.NotSerializableException al escribir objeto Serializable a un almacenamiento externo?
  • Ventajas de Parcelable sobre JSON
  • Almacenamiento en caché de los datos descargados de JSON en la base de datos SQLite - ¿es una buena idea?
  • One Solution collect form web for “Problemas de serialización de RealmList (Realm / Gson / Intent)”

    Serializable no funcionará con RealmList , pero puede usar la biblioteca Parceler y implementar Parcelable para parcelar RealmObjects (nota: ¡los convertirá en copias no administradas!)

     @Parcel(implementations = { UserRealmProxy.class }, value = Parcel.Serialization.BEAN, analyze = { User.class }) public class User extends RealmObject { // ... } compile "org.parceler:parceler-api:1.0.3" apt "org.parceler:parceler:1.0.3" 

    Para empaquetar RealmList, utilice el siguiente código

     /* Copyright 2016 Patrick Löwenstein * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class RealmListParcelConverter implements TypeRangeParcelConverter<RealmList<? extends RealmObject>, RealmList<? extends RealmObject>> { private static final int NULL = -1; @Override public void toParcel(RealmList<? extends RealmObject> input, Parcel parcel) { if (input == null) { parcel.writeInt(NULL); } else { parcel.writeInt(input.size()); for (RealmObject item : input) { parcel.writeParcelable(Parcels.wrap(item), 0); } } } @Override public RealmList fromParcel(Parcel parcel) { int size = parcel.readInt(); RealmList list = new RealmList(); for (int i=0; i<size; i++) { Parcelable parcelable = parcel.readParcelable(getClass().getClassLoader()); list.add((RealmObject) Parcels.unwrap(parcelable)); } return list; } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.