2016-05-19 1 views
13

Ich habe diese Klasse mit enums verwenden. Parsing zu Firebase json funktionierte gut - mit Jackson. Während der Migration-Datenbank Firebase zu: 9.0.0 bekomme ich folgendes:Android Firebase 9.0.0 setValue Serialisierung Enums

com.google.firebase.database.DatabaseException: Keine Objekte auf Klasse gefunden zu serialisiert .... MyClass $ Art

wobei Kind der deklarierte Typ ist. Die Klasse:

public class MyClass { 

    public enum Kind {W,V,U}; 

    private Double value; 
    private Kind kind; 

    /* Dummy Constructor */ 
    public MyClass() {} 

    public Double getValue() { 
     return value; 
    } 

    public void setValue(Double value) { 
     this.value = value; 
    } 

    public Kind getKind() { 
     return kind; 
    } 

    public void setKind(Kind kind) { 
     this.kind = kind; 
    } 
} 

Ich vermute, Firebase nicht mehr Jackson verwendet, wenn setValue (new MyClass()) Serialisierung.

Gibt es eine Möglichkeit, Enum-Typen serialisiert zu bekommen? Oder einige Mittel, um in Bezug auf die Serializer-Methode explizit zu sein?

+1

Ich würde überdenken, eine Antwort zu akzeptieren, die eindeutig keine langfristige Lösung ist. Während es schön ist, Jackson nicht mehr importieren zu müssen, haben wir die Kontrolle über unseren Code für neue, glänzende Funktionen aufgegeben, die viele von uns nicht benötigen. Bis Firebase es uns erlaubt, den JSON-Serializer über sein SDK zu konfigurieren, würde ich argumentieren, dass es im Moment keine akzeptable Lösung gibt. –

Antwort

15

Sie haben recht, Firebase Database verwendet Jackson nicht mehr für Serialisierung oder Deserialisierung.

Sie können Ihre Enum als String darstellen, wenn dies zu Firebase im Gespräch, indem Sie:

public class MyClass { 

    public enum Kind {W,V,U}; 

    private Double value; 
    private Kind kind; 

    /* Dummy Constructor */ 
    public MyClass() {} 

    public Double getValue() { 
     return value; 
    } 

    public void setValue(Double value) { 
     this.value = value; 
    } 

    // The Firebase data mapper will ignore this 
    @Exclude 
    public Kind getKindVal() { 
     return kind; 
    } 

    public String getKind() { 
     // Convert enum to string 
     if (kind == null) { 
      return null; 
     } else { 
      return kind.name(); 
     } 
    } 

    public void setKind(String kindString) { 
     // Get enum from string 
     if (kindString == null) { 
      this.kind = null; 
     } else { 
      this.kind = Kind.valueOf(kindString); 
     } 
    } 
} 
+1

Danke, das hilft! Ich habe gerade die Null-Checks hinzugefügt. Und der Vollständigkeit halber in Art.valueOf sollte man auch die IllegalArgumentException überprüfen. Aber die Absichten, was zu tun ist, können hier variieren. – rmarau

+0

Die Null-Checks hinzugefügt, danke! Könnten Sie die Antwort als akzeptiert markieren, wenn dies für Sie funktioniert hat? –

+0

Danke für die Antwort, weiß jemand, warum die Jackson-Serialisierung entfernt wurde? es war ziemlich praktisch ... –

2

Genau wie eine Seite Antwort Optimierung In Android, wird empfohlen, nicht Aufzählungen zu verwenden. Verwenden Sie @StringDef oder @IntDef, dass es ohne Workarounds funktionieren könnte und Sie Ihre App für den Speicher optimiert haben.

Sehr schöne Video Begründung, warum: https://www.youtube.com/watch?v=Hzs6OBcvNQE