2016-06-23 10 views
0

Mit einer alten Firebase (com.firebase:firebase-client-android:2.5.2) können wir dies tun:Wie machst du Tricks in einem alten Firebase mit JsonAutoDetect?

@JsonAutoDetect(
    fieldVisibility = JsonAutoDetect.Visibility.ANY, 
    isGetterVisibility = JsonAutoDetect.Visibility.NONE, 
    getterVisibility = JsonAutoDetect.Visibility.NONE, 
    setterVisibility = JsonAutoDetect.Visibility.NONE) 
public class BaseForEveryDataClass { 
    //some library staff 
} 

Diese uns diese Tricks zu tun erlaubt:

public class Identity extends BaseForEveryDataClass { 
    private String id; 

    public String getId(){ 
     return id; 
    }; 
    //(1) protect id from change, get it internally from firebase 
} 

public class Movie extends Identity { 
    //(2) Firebase was detecting the id field for all ancestors of identity 

    private String imdbId; 
    public Movie(JSONObject json/*ApiResponse*/) { 
     imdbId = json.getString("imdb"); //no setter, cannot change it outside 
    } 
    //(3) no getter for imdbId - it useless by itself, but have to be stored in a db 

    //(4) I don't need field "imdbLink" stored in a db, it's calculated 
    public String getImdbLink() { 
     return Constants.IMDB_PREFIX+imdbId; 
    } 
} 

public class User extends Identity { 
    //(2) no id field again in a Google-Firebase 

    //(3) another completely hidden field 
    private long remindToRateUs = 0; 

    public boolean shouldShowRateDialog() { 
     return remindToRateUs < System.currentTimeInMillis(); 
    } 

    public void remindLater() { 
     remindToRateUs = System.currentTimeInMillis() + Constants.MONTH; 
    } 
} 

dieses in Firebase 2.5 funktioniert also, aber ich kann einen Weg nicht finden tun sie es einfach und sicher in Firebase 9 (Google-enhanced, com.google.firebase:firebase-database:9.0.2)

So die Fragen:

(1 + 2) Ist es eine Möglichkeit, alle privaten Felder in allen Basisklassen und der beibehaltenen Klasse beizubehalten, wie in einem alten analogen Firebase? Ich weiß, wir können Abhilfe, die mit

//inside all ancestors 
public int getId() { 
    super.getId(); 
} 

aber es ist sehr nicht fehlersicher und nur unnötige Mehrarbeit;

(3) Wie können interne Felder nach dem Upgrade von Google dauerhaft ausgeblendet werden? Die Problemumgehung besteht darin, extern sichtbare Getter und/oder Setter für sie hinzuzufügen. Aber das macht Ihre Datenklasse anfällig für Hacker von außen und verletzt die Kapselung.

(4) wie können Sie Persistenz von ALLE „Utility-Getter“ deaktivieren (Getter ohne Sicherung der realen Datenfeld, Laufzeit berechnet) auf einmal ohne JsonAutoDetect? Ich weiß, dass wir @Exclude zu jedem von ihnen hinzufügen können. Jeder von ihnen, Carl!

@Google, warum ??? O_o Es hat gut funktioniert!

Antwort

1

firebaser hier

Versionen 1.x und 2.x des Firebase SDK für Android verwendet Jackson intern für die Serialisierung/Deserialisierung zwischen JSON und Java-Objekte. Während Jackson eine unglaublich starke Bibliothek ist, war die Abhängigkeit allein für mehr als die Hälfte unserer Glasgröße verantwortlich. Aus diesem Grund haben wir in der neuesten Version die Jackson-Abhängigkeit durch benutzerdefinierte Serialisierung/Deserialisierung ersetzt.

Wir haben die wichtigsten Anwendungsfälle, die wir kennen, abgedeckt und überwachen die Community aktiv auf Anwendungsfälle, die wir möglicherweise übersehen haben. Wenn ein solcher Fall erkannt wird, überlegen wir, ob wir ihn hinzufügen können, ohne APKs zu beeinträchtigen, die die Funktionalität nicht zu sehr benötigen.

Auch wenn die erforderliche Funktionalität im Firebase SDK fehlt, können Sie problemlos zum vorherigen Verhalten zurückkehren, indem Sie explizit von Jackson abhängen und dieses erneut verwenden. Siehe meine Antwort auf diese Frage für ein Beispiel dafür: How to deserialise a subclass in Firebase using getValue(Subclass.class)

+0

Danke für die Optionen. Mir geht es gut, abhängig von Jackson. Aber ich kann mir wirklich nicht vorstellen, dass eine Basismethode in einer Root-Basisklasse einmal erstellt wird und nicht an jeder Stelle kopiert wird, an der ich Daten benötige. –

+0

Tut mir leid, ich kann es nicht als Antwort akzeptieren, weil es keine meiner Fragen beantwortet. –

Verwandte Themen