【问题标题】:How do you do tricks available in an old Firebase with JsonAutoDetect?您如何使用 JsonAutoDetect 在旧的 Firebase 中使用可用的技巧?
【发布时间】:2016-06-24 00:31:45
【问题描述】:

使用旧的 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)如何在没有 JsonAutoDetect 的情况下一次禁用 ALL “utility-getters”(没有备份真实数据字段的 getters,运行时计算)的持久性? 我知道我们可以为每个人添加@Exclude。他们每个人,卡尔!

@Google,为什么??? O_o 一切正常!

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    firebaser 在这里

    适用于 Android 的 Firebase SDK 1.x 和 2.x 版本在内部使用 Jackson 在 JSON 和 Java 对象之间进行序列化/反序列化。虽然 Jackson 是一个非常强大的库,但仅依赖项就占了我们 jar 大小的一半以上。出于这个原因,我们在最新版本中用自定义序列化/反序列化替换了 Jackson 依赖项。

    我们已经介绍了我们知道的主要用例,并正在积极监控社区中我们可能遗漏的用例。当发现这种情况时,我们会考虑是否可以在不影响不需要太多功能的 APK 的情况下添加它。

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

    【讨论】:

    • 感谢您的选择。我对杰克逊的依赖很好。但是我真的无法想象根基类中的某些基方法可以制作一次,而不是将其复制粘贴到我需要数据的每个地方。
    • 对不起,我不能接受它作为答案,因为它没有回答我的任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2013-04-13
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多