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.

  • Pasar lista de objetos complejos de actividad a fragmento
  • ¿Por qué algunas veces funciona guardar un Hashtable de objetos no Parcelable en onSaveInstanceState ()?
  • Implementación de clase parcelable que requiere contexto
  • Android | Unmarshalling Tipo desconocido al utilizar datos parcelables en paquetes
  • Anidado Parcelling: RuntimeException - Unmarshalling tipo desconocido código 3211319 en el desplazamiento 440
  • Android, ¿Cómo usar el método readTypedList correctamente en una clase Parcelable?
  • Algunos objetos parcelables reunidos en un intento / paquete podrían interferir y comprometer la lectura de Intención / Bundle?
  • Extraer el texto de la notificación de parcelable, contentView o contentIntent
  • Android Class Parcelable con ArrayList
  • Android: Cualquier acceso directo a Serializable de Parcelable sin usar marshall ()?
  • Ampliación de una clase que implementa Parcelable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.