Cómo serializar el valor nulo cuando se utiliza Parcelable interfaz
Con respecto a mi ejemplo de código abajo, lo que hago si las variables de un Locable es nula? En el ejemplo, ahora si l.getZoom () devuelve null, obtuve NullPointerException.
@Override public void writeToParcel(Parcel parcel, int arg1) { parcel.writeInt(count); for(Locable l:locableArr){ parcel.writeInt(l.getOriginId()); parcel.writeInt(l.getLocableType()); parcel.writeInt(l.getZoom()); parcel.writeDouble(l.getLatituda()); parcel.writeDouble(l.getLongituda()); parcel.writeString(l.getTitle()); parcel.writeString(l.getSnipet()); } }
¡Gracias!
- Cómo pasar Drawable usando Parcelable
- Utilice Parcelable para pasar un objeto de una actividad de android a otra
- ¿Cómo leer / escribir un booleano al implementar la interfaz Parcelable?
- ¿Cómo ordenar y unmarshall un parcelable a un arsenal del byte con la ayuda del paquete?
- Fragmentos de Android que conservan datos
- Error al pasar de un objeto de una actividad a otra (utilizando parcelable)
- NullPointerException mientras se envía StringArray usando Parcelable
- Parcel.readException pasando un objeto al servicio remoto
- Android: pasar el objeto del widget de recopilación a la actividad
- Leer y escribir arreglos de objetos parcelables
- Android parcelable referenciando otra dependencia circular parcelable
- Ayuda con el paso de ArrayList y la actividad parcelable
- Persistencia de un objeto Parcelable en Android
Puede utilizar Parcel.writeValue
para ordenar objetos genéricos con valor nulo.
La mayoría del código de serialización que he visto utiliza indicadores para indicar la presencia o ausencia de un valor O precede al valor con un campo de recuento (por ejemplo, al escribir arreglos) donde el campo de recuento se pone a cero si el valor no es ' T existen en absoluto.
Examinar el código fuente de las clases principales de Android revela un código como este (de la clase Message):
if (obj != null) { try { Parcelable p = (Parcelable)obj; dest.writeInt(1); dest.writeParcelable(p, flags); } catch (ClassCastException e) { throw new RuntimeException( "Can't marshal non-Parcelable objects across processes."); } } else { dest.writeInt(0); }
O esto (de la clase Intent):
if (mCategories != null) { out.writeInt(mCategories.size()); for (String category : mCategories) { out.writeString(category); } } else { out.writeInt(0); }
Mi sugerencia: En su código, si no hay diferencia funcional entre "zoom == null" y "zoom == 0", entonces yo sólo declararía zoom como un primitivo ( int
lugar de Integer
) O inicializar a cero en el Constructor y asegúrese de que nunca se establece en null (entonces se puede garantizar que nunca será nulo y no tendrá que agregar código especial para hacer frente a eso en sus métodos de serialización / deserialización).
Esta es la solución que me ocurrió para escribir cuerdas con seguridad:
private void writeStringToParcel(Parcel p, String s) { p.writeByte((byte)(s != null ? 1 : 0)); p.writeString(s); } private String readStringFromParcel(Parcel p) { boolean isPresent = p.readByte() == 1; return isPresent ? p.readString() : null; }
Estoy utilizando una clase Parcelable
que tiene campos Integer
y Boolean
, así, y esos campos pueden ser nulos.
Tuve problemas con el método Parcel.writeValue
genérico, particularmente cuando estaba tratando de leerlo a través de Parcel.readValue
. Seguí recibiendo una excepción de tiempo de ejecución que decía que no podía averiguar el tipo de objeto parcelado.
En última instancia, pude resolver el problema usando Parcel.writeSerializable
y Parcel.readSerializable
con un molde de tipo, ya que tanto Integer
como Boolean
implementan la interfaz Serializable. Los métodos de lectura y escritura manejan valores null
para usted.
- NoSQL para aplicaciones móviles?
- Inicio del emulador de Android en las herramientas de SDK, revisión 12