如何通过具有不可序列化数据的意图传递数组或数组列表?

Posted

技术标签:

【中文标题】如何通过具有不可序列化数据的意图传递数组或数组列表?【英文标题】:How to pass array or arraylist by intent which has unserializable data? 【发布时间】:2019-01-26 08:03:28 【问题描述】:

我想做的是通过 Intent 在 Activity 之间传递 DataModel 数组。

DataModel 类有 Bitmap 对象和 FirebaseVisionLabel 对象。我找到了很多网站来实现这一点。

很多人说DataModel类应该实现Serializable或者Parceable接口来传递DataModel[]或者ArrayList<DataModel>

所以我尝试了,但真正的问题是 FirebaseVisionLabel 类无法序列化。另外,我无法修改该类,因为它是 firebase 库。

如何按意图传递 DataModel 数组??

    想按意图传递我自己的类的数组或数组列表。 该类具有不可序列化的对象,我无法修改。 如何通过或处理?

【问题讨论】:

将您的ArrayList<DataModel> 声明为静态并使用类名访问和访问它 【参考方案1】:

使用 Parceable。效果很好

public class Test implements Parcelable

    FirebaseVisionLabel firebaseVisionLabel;
    String testString;

    protected Test(Parcel in) 
        testString = in.readString();
    

    public static final Creator<Test> CREATOR = new Creator<Test>() 
        @Override
        public Test createFromParcel(Parcel in) 
            return new Test(in);
        

        @Override
        public Test[] newArray(int size) 
            return new Test[size];
        
    ;

    public FirebaseVisionLabel getFirebaseVisionLabel() 
        return firebaseVisionLabel;
    

    public void setFirebaseVisionLabel(FirebaseVisionLabel firebaseVisionLabel) 
        this.firebaseVisionLabel = firebaseVisionLabel;
    

    public String getTestString() 
        return testString;
    

    public void setTestString(String testString) 
        this.testString = testString;
    

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel dest, int flags) 
        dest.writeString(testString);
    

之后通过意图传递数据

   Test test = new Test();
    test.setTestString("test");
    test.setFirebaseVisionLabel(yourObject);

    Intent intent = new Intent(this, BaseActivity.class);
    intent.putExtra("key", test);
    startActivity(intent);

【讨论】:

看到这个错误java.lang.RuntimeException: Parcel: unable to marshal value com.google.firebase.ml.vision.label.FirebaseVisionLabel@d7a3ee5 我想他问的是没有序列化或可打包的@Arsalan 不,他说 parcelable 和 serialized 不适合他 @baeharam 另一种方法是创建 Singleton 类并在其对象上设置数据,并在另一个活动上从该对象获取数据。 你们一点都不懂!!我的问题是 FirebaseVisionLabel 对象不能被序列化。所以,我不能使用 Parceable 接口,那我该如何通过呢?这是我的问题。【参考方案2】:

使用下面的代码来获取没有序列化或 Parcelable 的 ArrayList 数据:

考虑,

Intent intent = new Intent(this, your_second_class.class);
intent.putStringArrayListExtra("<your_name_here>", your_list_here);
startActivity(intent);

然后在你的第二堂课中使用:

Intent i = getIntent();  
new_list = i.getStringArrayListExtra("<your_name_here>");

希望一切顺利。

【讨论】:

putStringArrayListExtra 用于ArrayList&lt;String&gt;,我的目标是通过ArrayList&lt;DataModel&gt;...DataModel 是我自己的类,它具有用于firebasevisionlabel 和位图的Object 变量【参考方案3】:

你可以使用Application类,它可以用在所有的屏幕、活动中。

因此,将数组存储在 Application 类中,并在应用程序的任何地方使用。

【讨论】:

【参考方案4】:

FirebaseVisionLabel 没有太多属性。您需要通过创建自己的 VisionLabelParcelable 类来序列化 Label / Confidence /...(您关心的任何内容)。

到目前为止,没有足够的用例让 ML Kit 返回 Parcelable FirebaseVisionLabel。大多数应用程序应该提取他们感兴趣的信息并在需要时传递。

【讨论】:

以上是关于如何通过具有不可序列化数据的意图传递数组或数组列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组一个活动传递给另一个android [重复]

如何将不可序列化的对象传递给意图服务?

将parcelables的数组列表传递给不同的活动? [复制]

无法通过intent将数组列表从一个活动传递到另一个活动

在具有多个数组列表<>的 ASP.Net Core 应用程序上显示 SQL 数据 [重复]

c# 中是不是默认通过引用传递数组或列表?