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!
- Error al pasar de un objeto de una actividad a otra (utilizando parcelable)
- Odd Error "Clase no encontrada al desmarcar"
- WriteToParcel () no se llama en los cambios de orientación en Android
- Objetos complementarios en las interfaces Kotlin
- Android: pasar el objeto del widget de recopilación a la actividad
- ¿Cómo escribir Java.util.Map en el paquete de una manera inteligente?
- ¿Cómo pasar el objeto Parcelable del niño a la actividad de los padres?
- Poner un mapa de bits en un paquete
- Cómo en Android pasar un objeto a un nuevo propósito
- Paquete interior parcelable que se agrega a la parcela
- Errores de unmarshalling en la aplicación de Android con clases parcelables personalizadas
- List <String> readStringArray en Parcelable
- ¿Por qué utilizar parcelable cuando se puede realizar la misma tarea utilizando variables estáticas?
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