【问题标题】:Firebase "Parcelable encountered IOException writing serializable object" with object containing ArrayList of DocumentReferenceFirebase“Parcelable 遇到 IOException 写入可序列化对象”,对象包含 DocumentReference 的 ArrayList
【发布时间】:2018-07-12 12:13:50
【问题描述】:

我正在尝试将包含 Firestore Arraylist DocumentReferenceUser 对象传递给另一个活动,当我开始活动时,我得到了这个异常。 我没有使用 Parceleable,所以您能否确认此错误是由于要传递的对象的复杂性造成的,我必须绝对使用 Parcels 而不是简单的 Serializeable?

感谢您的帮助

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    您收到该错误是因为 DocumentReference 类未实现 ParceleableSerializable

    如果您需要序列化DocumentReference 对象,您需要使用其getPath() 方法来获取描述文档在数据库中的位置的字符串。要将路径 String 反序列化回 DocumentReference 对象,请使用以下代码行:

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    DocumentReference ref = rootRef.document(path);
    

    FirebaseFirestore.getInstance().document(path)方法请查看官方文档。

    【讨论】:

    • 好的,所以我需要修改我的用户 POJO 以使用 ArrayList 而不是 ArrayList 重新定义我的用户对象,谢谢。
    • 是的,因为模型类中的所有对象都应该是可序列化的。不客气!
    【解决方案2】:

    接受的答案为我解决了问题。我只想分享我的几种方法来动态处理包裹的实现!并且数组仍然为ArrayList<DocumentReference>

    private ArrayList<String> docRefToString(ArrayList<DocumentReference> products) {
        ArrayList<String> newProducts = new ArrayList<String>();
        for (DocumentReference product : products) {
            newProducts.add(product.getPath());
        }
        return newProducts;
    }
    
    private ArrayList<DocumentReference> docStringToDoc(ArrayList<String> products) {
        ArrayList<DocumentReference> newProducts = new ArrayList<DocumentReference>();
        for (String product : products) {
            newProducts.add(FirebaseFirestore.getInstance().document(product));
        }
        return newProducts;
    }
    

    Parcel 实现中..

    private Request(Parcel in) {
        ...
        ArrayList<String> strProducts = in.createStringArrayList();
        this.products = docStringToDoc(strProducts);
        ...
    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        ...
        dest.writeStringList(docRefToString(this.products));
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 2016-01-25
      • 2014-06-02
      • 1970-01-01
      • 2019-07-21
      • 2013-04-30
      • 2020-07-22
      • 2014-08-03
      相关资源
      最近更新 更多