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

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)

时间: 2024-08-03 00:36:17

[Android]Parcelable encountered IOException writing serializable object (name = xxx)的相关文章

Android Parcelable与Serializable详解及区别

Android Parcelable与 Serializable区别 1.作用 Serializable的作用是为了保存对象的属性到本地文件.数据库.网络流.rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的.而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体. 从上面的设计上我

Android Parcelable接口使用方法详解

Android Parcelable接口使用方法详解 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing

android java.io.IOException: Parent directory of file is not writable: /sdcard/

做Android一年多了!今天在北京总公司带几个新人入门! 这一周上了五天的课!又当了一把老师! 讲课的内容大概是:Android系统架构                   Activity生命周期Intent的验证流程                   UI布局                   SQLite ContentProvider                 BroadCast与Notification                 Service与aidl 今天居然碰见

Android Parcelable的使用

http://blog.csdn.net/zyc13701469860/article/details/6429934

Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置

最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没有用,百度了一下,有人说这是跟SELINUX有关,于是通过init.cpp看到了这三个枚举标志位: enum selinux_enforcing_status { SELINUX_DISABLED, SELINUX_PERMISSIVE, SELINUX_ENFORCING };static sel

Android中Intent传递对象的两种方法Serializable,Parcelable

Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable. 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC. 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelab

我的Android进阶之旅------>Android Service学习之AIDL, Parcelable和远程服务

AIDL的作用     由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界.     通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作.       AIDL (Android Interface Definition Language) 是一种I

Android Service学习之AIDL, Parcelable和远程服务

AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一 个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界. 通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作. AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在

解析Android中的Serializable序列化_Android

1.为何要序列化? -- 把内存中的java对象能够在磁盘上持久保存 -- 通过网络传输对象 -- 通过RMI(Remote Method Invocation 远程过程调用)传输. 通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象. (远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎存在于一个统一的JVM中,能够方便的通讯) 2.如何让Java对象可以被序列化? 在java里只需让目标