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!

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.

  • ¿Recuperar un objeto parcelable a través de un paquete siempre crea una nueva copia?
  • Código de tipo desconocido del paquete
  • Android, ¿Cómo usar el método readTypedList correctamente en una clase Parcelable?
  • Parcelable y herencia
  • Escribir una subclase de Parcelable a otra parcela
  • ¿Cómo maneja la superficie la recolección de basura después de ser parcelada en Android?
  • Escritura de arreglos de Parcelables a un paquete en Android
  • Android Parcelable en Kotlin: CREATOR no se encuentra en la clase de datos Parcelable
  • ¿Qué es una comunicación más rápida usando un mensajero o una intención?
  • Implementar interfaz parcelable utilizando Gson
  • Cómo hacer una clase con objetos anidados Parcelable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.