首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JsonAutoDetect在旧的Firebase中使用技巧?

如何使用JsonAutoDetect在旧的Firebase中使用技巧?
EN

Stack Overflow用户
提问于 2016-06-23 11:50:42
回答 1查看 94关注 0票数 0

使用旧的Firebase (com.firebase:firebase-client-android:2.5.2),我们可以这样做:

代码语言:javascript
复制
@JsonAutoDetect(
    fieldVisibility = JsonAutoDetect.Visibility.ANY,
    isGetterVisibility = JsonAutoDetect.Visibility.NONE,
    getterVisibility = JsonAutoDetect.Visibility.NONE,
    setterVisibility = JsonAutoDetect.Visibility.NONE)
public class BaseForEveryDataClass {
    //some library staff
}

这样我们就可以做这些技巧了:

代码语言:javascript
复制
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)是一种在所有基类和持久化类中持久化所有私有字段的方法,就像我们在旧的模拟火库中一样?我知道我们可以解决这个问题

代码语言:javascript
复制
//inside all ancestors
public int getId() {
    super.getId();
}

但这是非常不错误的,只是不必要的额外工作;

(3):在谷歌升级之后,我们怎么能保持隐藏的内部字段呢?解决方法是为它们添加外部可见的getter和/或setter。但这使得您的数据类容易受到外部攻击,从而违反了封装。

(4)如何在没有JsonAutoDetect的情况下禁用ALL“实用程序-getter”(没有实际数据字段的备份、运行时计算的getter)的持久性?我知道我们可以在每个人中加上“排除”。他们每个人,卡尔!

@Google,为什么?O_o --它运转得很好!

EN

回答 1

Stack Overflow用户

发布于 2016-06-23 13:40:07

这里的消防队员

1.x和2.x版本的Firebase内部使用杰克逊在JSON和Java对象之间进行序列化/反序列化。虽然Jackson是一个功能强大的库,但仅依赖项就占了我们jar大小的一半以上。因此,在最新的版本中,我们已经用自定义序列化/反序列化替换了Jackson依赖项。

我们已经讨论了我们所知道的主要用例,并且正在积极地监视社区的用例--我们可能错过了。当确定这样的情况时,我们考虑是否可以在不影响不太需要功能的APK的情况下添加它。

即使在Firebase中缺少所需的功能,您也可以通过显式依赖Jackson并再次使用它,轻松地恢复到以前的行为。关于这个问题的一个例子,请看我的答案:如何使用getValue(Subclass.class)反序列化Firebase中的子类

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37990803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档