Cómo deserializar una subclase en Firebase usando getValue (Subclass.class)

Estoy usando la nueva firebase sdk para android y uso la función de base de datos real. Cuando uso el getValue(simple.class) todo está bien. Pero cuando quiero analizar una clase que es una subclase, todo el atributo de la clase madre es null , y tengo este tipo de error:

No setter / field para el nombre encontrado en la clase uk.edume.edumeapp.TestChild

 public class TestChild extends TestMother { private String childAttribute; public String getChildAttribute() { return childAttribute; } } public class TestMother { protected String motherAttribute; protected String getMotherAttribute() { return motherAttribute; } } 

esta función

 snapshot.getValue(TestChild.class); 

motherAttribute atributo motherAttribute es null , y obtengo

No setter / field para motherAttribute encontrado en la clase uk.edume.edumeapp.TestChild

El Json que analizo es:

 { "childAttribute" : "attribute in child class", "motherAttribute" : "attribute in mother class" } 

Firebaser aquí

Este es un error conocido en algunas versiones del SDK de base de datos de Firebase para Android: nuestro serializador / deserializador sólo considera propiedades / campos en la clase declarada.

Serialización de propiedades heredadas de la clase base, falta en las versiones 9.0 a 9.6 (iirc) del SDK de base de datos Firebase para Android. Fue agregado de nuevo en versiones desde entonces.

Solución

Mientras tanto, puede utilizar Jackson (que los SDK de Firebase 2.x utilizan bajo el capó) para hacer que el modelo de herencia funcione.

Actualización : aquí hay un fragmento de cómo puede leer de JSON en su TestChild :

 public class TestParent { protected String parentAttribute; public String getParentAttribute() { return parentAttribute; } } public class TestChild extends TestParent { private String childAttribute; public String getChildAttribute() { return childAttribute; } } 

getParentAttribute() que he hecho getParentAttribute() público, porque solo se consideran los campos / getters públicos. Con ese cambio, este JSON:

 { "childAttribute" : "child", "parentAttribute" : "parent" } 

Se puede leer con:

 ObjectMapper mapper = new ObjectMapper(); GenericTypeIndicator<Map<String,Object>> indicator = new GenericTypeIndicator<Map<String, Object>>() {}; TestChild value = mapper.convertValue(dataSnapshot.getValue(indicator), TestChild.class); 

El GenericTypeIndicator es un poco raro, pero afortunadamente es un encantamiento mágico que puede ser copiado / pegado.

Esto aparentemente fue finalmente fijado en la versión 9.6 .

Corregido un problema en el que pasar una clase derivada a DatabaseReference # setValue () no guardó correctamente las propiedades de la superclase.

para:

No setter / field para motherAttribute encontrado en la clase uk.edume.edumeapp.TestChild

Poner setter para la clase TestChild:

  public class TestMother { private String motherAttribute; public String getMotherAttribute() { return motherAttribute; } //set public void setMotherAttribute(String motherAttribute) { this.motherAttribute= motherAttribute; } } 

Consulta esta https://firebase.google.com/support/guides/firebase-android

dice

"Si hay una propiedad adicional en su JSON que no está en su clase Java, verá esta advertencia en los archivos de registro: W / ClassMapper: No setter / field para ignoreThisProperty encontrado en la clase com.firebase.migrationguide.ChatMessage"

Blockquote

Puedes deshacerte de esta advertencia poniendo una anotación @IgnoreExtraProperties en tu clase. Si desea que la base de datos Firebase se comporte como en el SDK 2.x y lance una excepción si hay propiedades desconocidas, puede poner una anotación @ThrowOnExtraProperties en su clase.

Blockquote

  • Obtener el nombre del método del llamador de mi método
  • Error de actualización La cadena de consulta de URL no debe tener el bloque de reemplazo
  • OpenCV - Java: función inRange
  • Android - Facebook SDK login -> cerrar sesión -> inicio de sesión no funciona
  • ¿Hay alguna razón por la que no debería almacenar mi almacén de claves en el control de versiones?
  • Problemas con la tarjeta SD de Android
  • Guardar archivo en Android con espacios en el nombre de archivo
  • Flip imágenes en un viewpager
  • Android eliminación de un archivo de almacenamiento interno
  • ¿Cómo extender la clase SQLiteDatabase?
  • Pase y reciba el objeto JSON de Jersey Resftul webservice desde android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.