[Android]Parcelable encountered IOException writing serializable object (name = xxx)

本文详细介绍了Android Activity之间如何通过Intent传递不同类型的值,包括基本数据类型、String对象及其数组,以及实现了Serializable或Parcelable接口的类对象。重点讨论了在实现数据交换时遇到的问题及解决方案,特别强调了所有传递的对象都必须实现Serializable接口的重要性。

Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte、byte[]、char、char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、float[]、double、double[]、String、String[],还有实现Serializable、Parcelable接口的类对象。

package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

	private Button btnSend;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btnSend = (Button)findViewById(R.id.send);
		btnSend.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		if(v.getId() == R.id.send){
			Intent intent = new Intent(this, HomeActivity.class);  
	        Bundle bundle = new Bundle();  
	        bundle.putString("Data", "hello.......");
	        User user = new User();
	        user.setAge(11);
	        user.setName("xiaosi");
	        bundle.putSerializable("User", user);
	        intent.putExtras(bundle);  
	        startActivity(intent);  
		}
	}

}

package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.TextView;

public class HomeActivity extends Activity {

	private TextView text;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_home);
		
		Intent intent=getIntent();  
        Bundle bundle=intent.getExtras();  
        String str=bundle.getString("Data");  
        User user = (User) bundle.getSerializable("User");
        
        text=(TextView)findViewById(R.id.text);  
        text.setText(str+"姓名:"+user.getName()+"年龄:"+user.getAge());  
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.home, menu);
		return true;
	}

}


所以说activity之间传递自己定义数据,仅仅能实现implements Serializable或者Parcelable接口。 

能够用bundle putSerializable(String,Serizlizable)数据或者直接用intent putExtrr(String,Serizlizable)数据。 

我有一个需求须要传递多个自己定义类型数据,于是我写了一个对象把我须要的那些自己定义数据封装了起来,这个类实现了Serizlizable接口。可是在putExtra的时候出现了错误。 

后来我发现要想在Activity之间传递数据必须全部的内容都实现serializable接口才行,而我的对象中封装的一个自己定义类型数据没有实现这个接口,所以出现了错误。 

之后我让那个自己定义类型实现了serializable接口就没有问题了。

我自己定义了一个TransmitData对象,实现了serializable接口。

package com.sjf.model;

import java.io.Serializable;
import java.util.Date;

/**
 * 传输的对象,直接通过Socket传输的最大对象
 * @author XIAOSI
 *
 */
public class TransmitData implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//发送的消息类型
	private TransmitType type;
	// 来自哪个用户
	private String fromUser;
	// 发往哪个用户
	private String toUser;
	// 传输的内容
	private User user;
	// 请求结果
	private boolean isSucess;
	// 请求说明,反馈说明
	private String description;
	// 请求或者反馈时间
	private Date time;
	
	
	public Date getTime() {
		return time;
	}
	public void setTime(Date time) {
		this.time = time;
	}
	public boolean isSucess() {
		return isSucess;
	}
	public void setSucess(boolean isSucess) {
		this.isSucess = isSucess;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public TransmitType getType() {
		return type;
	}
	public void setType(TransmitType type) {
		this.type = type;
	}
	public String getFromUser() {
		return fromUser;
	}
	public void setFromUser(String fromUser) {
		this.fromUser = fromUser;
	}
	public String getToUser() {
		return toUser;
	}
	public void setToUser(String toUser) {
		this.toUser = toUser;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}

然而TransmitData对象中自己定义数据类型User并没有实现序列化接口。

就报错出:Parcelable encountered IOException writing serializable object (name = xxx)






当在 Android 中遇到 "Parcelable encountered IOException writing serializable object" 错误时,这通常是由于递的对象没有正确实现 `Parcelable` 接口而导致的。要解决这个问题,您可以尝试以下几种方法: 1. 实现 Parcelable 接口:确保要传递的对象正确地实现了 Parcelable 接口。Parcelable 接口提供了一种序列化和反序列化对象的方式,以便在 Android 组件之间进行传递。您可以按照以下步骤实现 Parcelable 接口: - 在要传递的对象类中实现 Parcelable 接口。 - 实现 `writeToParcel(Parcel dest, int flags)` 方法,将对象的属性写入 Parcel 对象。 - 实现 `describeContents()` 方法,返回 0。 - 添加一个名为 `CREATOR` 的 `Parcelable.Creator` 对象,并实现 `createFromParcel(Parcel source)` 和 `newArray(int size)` 方法。 2. 序列化对象:如果您不需要使用 Parcelable 接口,而是希望使用 Java 的序列化机制,您可以确保要传递的对象正确地实现了 Serializable 接口。Serializable 接口提供了一种将对象序列化为字节流的机制,以便在 Java 中进行传递。请确保要传递的对象及其所有嵌套对象都实现了 Serializable 接口。 3. 检查对象中的属性:当一个对象实现了 ParcelableSerializable 接口时,其所有嵌套属性也必须是可序列化的。请确保对象中的所有属性都实现了 ParcelableSerializable 接口。 4. 避免传递大型对象:尽量避免传递大型对象,特别是 Bitmap 等占用大量内存的对象。如果传递大型对象是必需的,可以考虑其他方式,如使用文件或数据库进行传递。 通过以上方法,您应该能够解决 "Parcelable encountered IOException writing serializable object" 错误。如果问题仍然存在,请检查错误日志以获取更详细的信息,并在需要时提供相关代码以便更好地帮助您解决问题。如有任何疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值