使用Serializable通过意图传递数据

79

我已经使用了serializable在我的类中,但它仍然无法正常工作。

这是我的类:

package com.ursabyte.thumbnail;

import java.io.Serializable;

import android.graphics.Bitmap;

public class Thumbnail implements Serializable {

    private static final long serialVersionUID = 1L;
    private String label = "";
    private Bitmap bitmap;

    public Thumbnail(String label, Bitmap bitmap) {
        this.label = label;
        this.bitmap = bitmap;
    }

    public void set_label(String label) {
        this.label = label;
    }

    public String get_label() {
        return this.label;
    }

    public void set_bitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public Bitmap get_bitmap(){
        return this.bitmap;
    }

    //  @Override
    //  public int compareTo(Thumbnail other) {
    //      if(this.label != null)
    //          return this.label.compareTo(other.get_label());
    //      else
    //          throw new IllegalArgumentException();
    //  }

}

这就是我想要传递的内容。

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
all_thumbs.add(new Thumbnail(string, bitmap));
Intent intent = new Intent(getApplicationContext(), SomeClass.class);
intent.putExtra("value", all_thumbs);

但是它仍然不起作用。我不知道如何使用Parcelable,所以我使用了这个代替。


2
Bitmap类没有实现Serializable接口。你需要在这里使用Parcelable。然而,使用Parcelable传递位图不是一个好主意... - Vladimir Mironov
字节数组怎么样?它是否实现了Serializable接口? - Bias Tegaralaga
是的,但要小心大对象。意图对于附加信息有大小限制。 - Vladimir Mironov
你可以在bitmap前面加上transient,像这样: private transient Bitmap bitmap; - noone
13个回答

172

尝试使用Bundle.Serializable传递可序列化列表:

Bundle bundle = new Bundle();
bundle.putSerializable("value", all_thumbs);
intent.putExtras(bundle);

在 SomeClass Activity 中获取它的方式如下:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

List<Thumbnail> thumbs=
               (List<Thumbnail>)bundle.getSerializable("value");

2
我遇到了这个错误:java.lang.RuntimeException: Parcelable 在写可序列化对象(名称为com.ursabyte.thumbnail.Thumbnail)时遇到了IOException。 - Bias Tegaralaga
@tegaralaga:请看这个例子http://www.cnblogs.com/jsonxing/archive/2011/08/17/2143458.html - ρяσѕρєя K
问题在于Bitmap类没有像@vmironov所说的那样实现Serializable :) - Bias Tegaralaga
@tegaralaga:是的,我明白了。然后将位图更改为图像URL,并在下一个类中转换相关图像,而不是将更多的位图传递到其他活动中。 - ρяσѕρєя K
@tegaralaga:如果这个答案帮助解决了你当前的问题,请将其标记为答案。谢谢。 - ρяσѕρєя K
显示剩余4条评论

15
这段代码可能会对你有所帮助:
public class EN implements Serializable {
//... you don't need implement any methods when you implements Serializable
}

存储数据。 创建新的 Activity 并添加额外信息:

EN enumb = new EN();
Intent intent = new Intent(getActivity(), NewActivity.class);
intent.putExtra("en", enumb); //second param is Serializable
startActivity(intent);

从新活动中获取数据:
public class NewActivity extends Activity {

    private EN en;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
            }
//...

2
对象 "en" 可为空。 - brunoramonalmeida

7
不要忘记在你的每个对象将要使用的类中实现Serializable,比如对象列表。否则你的应用程序会崩溃。
例子:
public class City implements Serializable {

private List<House> house;

public List<House> getHouse() {
    return house;
}

public void setHouse(List<House> house) {
    this.house = house;
}}

那么House需要这样实现Serializable:

public class House implements Serializable {

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}}

然后你可以使用:

Bundle bundle = new Bundle();
bundle.putSerializable("city", city);
intent.putExtras(bundle);

并通过以下方式检索:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
City city =  (City)bundle.getSerializable("city");

1
这只是对一个备受好评问题的部分解决方案。您能详细说明一下吗? - harmonica141
假设你有一个House对象,并且你需要将一个拥有房屋列表的City类序列化。你需要在House类和City类中实现Serializable接口。 - Colyn Tidman
请通过编辑按钮改进您的回答,包含至少几个单词以帮助解释它。应该使用[编辑]按钮而不是添加评论。评论应用于请求更多信息或建议改进。 - Joey

7
我扩展了ρяσѕρєя K的答案,使代码完整且可行。因此,当你填写完你的“all_thumbs”列表后,应该逐个将其内容放入bundle,然后再放入intent中:
Bundle bundle = new Bundle();

for (int i = 0; i<all_thumbs.size(); i++)
bundle.putSerializable("extras"+i, all_thumbs.get(i));

intent.putExtras(bundle);

为了获取意图中的附加信息,您需要:

Bundle bundle = new Bundle();
List<Thumbnail> thumbnailObjects = new ArrayList<Thumbnail>();

// collect your Thumbnail objects
for (String key : bundle.keySet()) {
thumbnailObjects.add((Thumbnail) bundle.getSerializable(key));
}

// for example, in order to get a value of the 3-rd object you need to:
String label = thumbnailObjects.get(2).get_label();
Serializable的优点在于其简单性。但是,当需要传输大量数据时,我建议您考虑使用Parcelable方法,因为Parcelable是专门为Android设计的,并且比Serializable更有效率。您可以使用以下方法创建Parcelable类:
  1. 在线工具- parcelabler
  2. Android Studio插件 - Android Parcelable code generator

请注意,html标签已保留。

6

发送数据:

首先,通过将Serializable接口实现到您的数据类中,使其可序列化。

public class YourDataClass implements Serializable {
String someText="Some text";
}

然后将其放入意图中。
YourDataClass yourDataClass=new YourDataClass();
Intent intent = new Intent(getApplicationContext(),ReceivingActivity.class);
intent.putExtra("value",yourDataClass);
startActivity(intent);

接收数据:

YourDataClass yourDataClass=(YourDataClass)getIntent().getSerializableExtra("value");

3
在 Kotlin 中: Object 类实现了 Serializable 接口:
class MyClass: Serializable {
//members
}

在对象发送的时刻:

val fragment = UserDetailFragment()
val bundle = Bundle()
bundle.putSerializable("key", myObject)
fragment.arguments = bundle

在我们想要获取对象的片段处:
val bundle: Bundle? = arguments
    bundle?.let {
        val myObject = it.getSerializable("key") as MyClass
        myObject.memberName?.let { it1 -> showShortToast(it1) }
    }

3
Intent intent = new Intent(getApplicationContext(),SomeClass.class);
intent.putExtra("value",all_thumbs);
startActivity(intent);

在SomeClass.java中

Bundle b = getIntent().getExtras();
if(b != null)
thumbs = (List<Thumbnail>) b.getSerializable("value");

2

您需要创建一个Bundle,然后使用putSerializable

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
all_thumbs.add(new Thumbnail(string,bitmap));
Intent intent = new Intent(getApplicationContext(),SomeClass.class);

Bundle extras = new Bundle();

extras.putSerializable("value",all_thumbs);
intent.putExtras(extras);

1
创建您的自定义对象并实现Serializable。接下来,您可以使用intent.putExtra("package.name.example", <your-serializable-object>)
在第二个活动中,您可以使用getIntent().getSerializableExtra("package.name.example")读取它。
否则,请访问thisthis页面。

0

要传递一个列表,首先在你的类中实现Serializable接口。

然后你必须将你的列表转换为可序列化的类型。

val bundle = Bundle();
bundle.putSerializable("list", list as Serializable)

在其他活动或片段中获取列表

val intent = this.getIntent()
val bundle = intent.getExtras()
val thumbs: List<Thumbnail> = bundle.getSerializable("list") as List<Thumbnail>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接