2016-07-30 4 views
8

Ich versuche, ein benutzerdefiniertes Objekt mit dem folgenden Code zu beharren:com.google.firebase.database.DatabaseException: Arrays Serialisierung wird nicht unterstützt, verwenden Sie bitte Listen statt

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference curWorkoutExercisesRef = databaseReference.child("workouts") 
      .child(mCurrentWorkout.getId()) 
      .child("workoutExercises"); 

WorkoutExercise we = new WorkoutExercise(exercise); 
curWorkoutExercisesRef.push().setValue(we); 

Hier ist mein Ziel:

public class WorkoutExercise { 

    private String id; 
    private Exercise exercise; 

    public WorkoutExercise() {} 

    // getters, setters, other methods 
    // ... 
} 

public class Exercise { 

    private String id; 
    private String title; 

    private List<BodyPart> bodyParts; 

    public Exercise() {} 

    // getters, setters, other methods 
    // ... 
} 

public class BodyPart { 

    private String id; 
    private String name; 

    public BodyPart() {} 

    // getters, setters, other methods 
    // ... 
} 

Und jedes Mal bekomme ich diesen Fehler - com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead. Meine Objekte enthalten keine Arrays, daher sieht dieser Fehler ziemlich verwirrend aus. Ich habe einen Weg gefunden, um diesen Fehler zu beheben - alles funktioniert gut, wenn ich die @Exclude Annotation zu der bodyParts Liste von meiner Exercise Klasse hinzufügen, aber es ist offensichtlich nicht das, was ich versuche zu erreichen.

Scheint, dass Firebase Objekte mit inneren Listen nicht beibehalten kann? Gibt es hier einfache Problemumgehungen oder Best Practices? Vielen Dank!

P.S. Ich benutze firebase-database:9.2.1

+3

Ich kann die Ausnahme nicht reproduzieren, wenn ich mit 'Firebase-Datenbank: 9.2.1' arbeite. Verwenden Sie eine andere Version? –

+1

@qbix aus Neugier: Wenn Sie eine 'List ' in die Datenbank serialisieren, mit welcher JSON enden Sie? –

+1

@FrankvanPuffelen: Die Liste wird als Array serialisiert. [JSON ist hier] (https://gist.github.com/Bob-Snyder/034685d998fddd8d1bcc3d52c93d1877) –

Antwort

7

Ich habe es geschafft, den Grund für diesen Absturz zu finden. Ich installierte die App auf einem anderen Gerät Android 5.x und Firebase warf es eine viel weniger verwirrend Ausnahme:

com.google.firebase.database.DatabaseException: No properties to serialize found on class android.graphics.Paint$Align 

Es schien, dass Firebase (im Gegensatz zu Gson) versucht, alle möglichen Getter serialisiert werden, auch wenn sie don‘ Ich habe direkte Verbindung mit globalen Variablen (Klassenmitglieder/Felder), in meinem speziellen Fall enthielt eines meiner Objekte eine Methode, die Drawable - getDrawable() zurückgibt. Offensichtlich weiß Firebase nicht, wie man zeichnbares in json umwandelt.

Interessanter Moment (wahrscheinlich ein Fehler in Firebase SDK): auf meinem älteren Gerät mit Android 4.4.1 ich noch meine ursprüngliche Ausnahme im selben Projekt und Konfiguration erhalten:

Caused by: com.google.firebase.database.DatabaseException: Serializing Arrays is not supported, please use Lists instead 
+0

das ist richtige Antwort .. großartig –

1

Ich hatte ein ähnliches Problem, Ich habe versucht, groovy anstelle von Java zu verwenden, ich denke, dass groovy andere Methoden für mich generiert. Ich wandelte meine Domain-Klasse von Pogo (src/main/groovy) zu Pojo (src/main/java) und jetzt alles gut funktioniert

0

hinzufügen @IgnoreExtraProperties Ihrer Klasse

@IgnoreExtraProperties 
public class YourPojo { 
    public String name; 

    // Default constructor for Firebase 
    public YourPojo(){} 

    // Normal constructor 
    public YourPojo(String name) { 
     this.name = name; 
    } 
} 
1

hinzufügen @Exclude zu die Funktionen, die FB zu interpretieren versucht, wie die, die eine Drawable zurückgeben.

@Exclude 
public Drawable getUnitColorImage(){ 
    return TextDrawable.builder().buildRound("", prefColor); 
} 
0

Hier ist, wie dies für mich gelöst wurde. Das Problem trat auf, als ich versuchte, ein int-Feld in der Datenbank zu aktualisieren. Ich habe Text aus dem Bearbeitungsfeld erhalten und vergessen, das in ein int umzuwandeln. Dies verursachte den Fehler. Versuchen Sie also, den Datentyp zu überprüfen, den Sie an die Datenbank senden, wenn dieses Problem auftritt.

1

Falls dies hilft anderen, die den gleichen Fehler erhalten, war ich immer die gleichen Fehler und die Lösung am Ende der für mich folgende sein:

Wechsel:

databaseReference.child("somechild").setValue(etName.getText()); 

zu :

databaseReference.child("somechild").setValue(etName.getText().toString()); 

Wie @fraggjkee weist darauf hin, versucht Firebase seriell Ize Getter, und das war das gleiche Problem hier mit Firebase versucht, das Ergebnis der .getText() zu serialisieren.

Hoffe das hilft anderen!

Verwandte Themen