2011-05-31 6 views
6

Los Intentos de Android tienen un conveniente método toURI() que los documentos de API parecen indicar que es una forma de serializar un Intento a un URI, y luego analizarlo de nuevo en un Intent. Lamentablemente, al probar esta funcionalidad, descubrí que no serializa todos los extras, solo los tipos primitivos (booleano, int, largo, flotante, cadena). Si un intento especifica cualquiera de los extras Parcelable o array, se perderán.¿Cómo serializas las intrusiones de Android?

¿Dónde (si hay) está documentada esta limitación? ¿Hay alguna razón obvia para este comportamiento (puedo imaginar algunas dificultades con Parcelables)? Y lo más importante, ¿existe una forma recomendada de serializar y analizar los Intentos?

Mi implementación actual simplemente escribe los componentes de Intento (acción, categorías, uri de datos y extras) en una SharedPreferences. Esta estrategia no es compatible con Parcelables.

Respuesta

6

Los Intentos de Android tienen un método toIUR() conveniente que los documentos de API parecen indicar que es una forma de serializar un Intento a un URI, y luego analizarlo de nuevo en un Intento.

Realmente no.

¿Dónde (si hay) está documentada esta limitación?

No esperaba que los extras se incluyeran en el Uri en absoluto. El punto detrás de este tipo de generación de Uri sería mostrarle cómo agregar el Uri como un enlace en un sitio web, y no debería necesitar extras para ese escenario.

toURI() no hay serialización.

Y lo más importante, ¿existe una forma recomendada de serializar y analizar las intenciones?

No. En particular, Parcelable no se puede serializar, por definición.

Mi implementación actual simplemente escribe los componentes de Intento (acción, categorías, uri de datos y extras) en una SharedPreferences.

Ese enfoque es simplemente extraño.

Utilice una base de datos. Si fue atacado por una base de datos cuando era un niño pequeño y, por lo tanto, vive con un miedo abyecto a las bases de datos, serialice usando JSON, XML o Serializable/ en un archivo. Use SharedPreferences para las preferencias del usuario.

Esta estrategia no es compatible con Parcelables.

Tampoco debería. Tampoco puede. Parcelable está diseñado para convertir un gráfico de objeto en un bloque de memoria para usarlo solo en un dispositivo en ejecución. No es un mecanismo de persistencia a largo plazo.

+0

Quizás debería haber explicado mi situación. Intento almacenar intenciones semipermanentes para transmisiones que se han recibido. Estos intentos tendrán acciones y extras conocidos solo en tiempo de ejecución.La acción y los extras se usan para iniciar y detener servicios arbitrarios, también conocidos solo en tiempo de ejecución. En lugar de construir una estructura de datos personalizada para almacenar los datos de intención, pensé que sería más fácil almacenar el intento original. Por lo que dices, parece que no sabes de una mejor manera que utilizar una estructura de datos personalizada. – Alan

+2

@ Alan: Necesitará una estructura de datos personalizada. Pocas, si las hay, las clases 'android. *' Implementan 'Serializable', que es lo que necesitarías para la serialización completa. La única forma en que se me ocurre que 'Serializable' funcione es crear tu propia subclase, hacer * it *' Serializable' y confiar en el constructor de copia 'Intent' para hacer la tarea de obtener información de un 'Intent' en su subclase' Serializable'. Para eso, solo escribiría las cosas a JSON. Pero, de nuevo, nunca me ha gustado 'Serializable'. – CommonsWare

Cuestiones relacionadas