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 !

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; } } 
  • Ahorro de grandes arreglos cortos android
  • ObjectInputStream me da un objeto vacío (pero el archivo leído no está vacío)
  • Enfoque para serializar la clase de modelo de punto final de nube en el sistema de archivos Android
  • Serialización de Java - deserialización de Android
  • ¿Puedo utilizar serialización con ofuscación?
  • ¿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
  • ClassCastException al recuperar datos del paquete en Android
  • Cómo serializar / deserializar arrayList (Object)
  • Gson serializar a LinkedTreeMap en lugar de mi Entidad
  • Intención de envío dentro de otra Intención
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.