你如何使用JsonAutoDetect在旧的Firebase中提供技巧?

时间:2016-06-23 11:50:42

标签: java android firebase firebase-realtime-database

使用旧的Firebase(com.firebase:firebase-client-android:2.5.2),我们可以执行此操作:

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

这允许我们做这些技巧:

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;
    }
}

所以这些在Firebase 2.5中运行,但我找不到在Firebase 9中轻松安全的方法(Google增强版,com.google.firebase:firebase-database:9.0.2

所以,问题

(1 + 2)是否可以在所有基类和持久化类中保留所有私有字段,就像我们在旧的模拟Firebase中一样? 我知道我们可以用

来解决这个问题
//inside all ancestors
public int getId() {
    super.getId();
}

但它非常不防错,只是不需要额外的工作;

(3) Google升级后如何保留隐藏的内部字段? 解决方法是为它们添加外部可见的getter和/或setter。但这会使你的数据类容易受到外部攻击,违反了封装。

(4)如何禁用所有&#34;实用程序获取者&#34;的持久性(没有备份实际数据字段的getter,运行时计算)没有JsonAutoDetect吗? 我知道我们可以为每个人添加@Exclude。他们每个人,卡尔!

@Google,为什么??? O_o工作正常!

1 个答案:

答案 0 :(得分:1)

firebaser here

Firebase SDK for Android的版本1.x和2.x在内部使用Jackson来在JSON和Java对象之间进行序列化/反序列化。虽然杰克逊是一个令人难以置信的强大的图书馆,但仅仅依赖依赖于我们超过一半的罐子大小。出于这个原因,我们在最新版本中用自定义序列化/反序列化替换了Jackson依赖项。

我们已经介绍了我们所知道的主要用例,并且正在积极监控社区,以了解我们可能错过的用例。当识别出这种情况时,我们会考虑是否可以添加它而不会影响不需要太多功能的APK。

即使Firebase SDK中缺少您需要的功能,您也可以通过明确依赖Jackson并再次使用它来轻松恢复到以前的行为。请参阅我对此问题的回答,并举例说明:How to deserialise a subclass in Firebase using getValue(Subclass.class)