使用旧的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工作正常!
答案 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)