使用旧的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(谷歌增强的,com.google.firebase:firebase-database:9.0.2)中,我找不到一种简单和安全的方法。
那么,的问题:
(1+2)是一种在所有基类和持久化类中持久化所有私有字段的方法,就像我们在旧的模拟火库中一样?我知道我们可以解决这个问题
//inside all ancestors
public int getId() {
super.getId();
}但这是非常不错误的,只是不必要的额外工作;
(3):在谷歌升级之后,我们怎么能保持隐藏的内部字段呢?解决方法是为它们添加外部可见的getter和/或setter。但这使得您的数据类容易受到外部攻击,从而违反了封装。
(4)如何在没有JsonAutoDetect的情况下禁用ALL“实用程序-getter”(没有实际数据字段的备份、运行时计算的getter)的持久性?我知道我们可以在每个人中加上“排除”。他们每个人,卡尔!
@Google,为什么?O_o --它运转得很好!
发布于 2016-06-23 13:40:07
这里的消防队员
1.x和2.x版本的Firebase内部使用杰克逊在JSON和Java对象之间进行序列化/反序列化。虽然Jackson是一个功能强大的库,但仅依赖项就占了我们jar大小的一半以上。因此,在最新的版本中,我们已经用自定义序列化/反序列化替换了Jackson依赖项。
我们已经讨论了我们所知道的主要用例,并且正在积极地监视社区的用例--我们可能错过了。当确定这样的情况时,我们考虑是否可以在不影响不太需要功能的APK的情况下添加它。
即使在Firebase中缺少所需的功能,您也可以通过显式依赖Jackson并再次使用它,轻松地恢复到以前的行为。关于这个问题的一个例子,请看我的答案:如何使用getValue(Subclass.class)反序列化Firebase中的子类
https://stackoverflow.com/questions/37990803
复制相似问题