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):
- Leer / escribir un objeto en un archivo
- Android NotSerializableException aumenta para un objeto
- Archivo de serialización en Android
- ¿Cuál es la mejor manera de serializar una imagen (compatible con Swing) de Java a Android?
- Serialización y des-serialización de android.graphics.Bitmap en Java
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 !
- Ventajas de Parcelable sobre JSON
- ¿Recomendaciones para datos persistentes en Android?
- ObjectInputStream me da un objeto vacío (pero el archivo leído no está vacío)
- Java.io.NotSerializableException al escribir objeto Serializable a un almacenamiento externo?
- Escribir XML en Android
- Serializar un objeto Drawable en Android
- Parcelable encontrado IOException writing serializable object getactivity ()
- Serialización de objetos para una nueva actividad
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; } }
- Android: TableLayout alinear la primera columna a la derecha, la segunda a la izquierda
- Cómo calentar el dispositivo Android a 40 grados a través de Unity?