• [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)






  • 相关阅读:
    在opencv3中实现机器学习之:利用正态贝叶斯分类
    在opencv3中进行图片人脸检测
    在opencv3中利用SVM进行图像目标检测和分类
    在opencv3中实现机器学习之:利用svm(支持向量机)分类
    在matlab和opencv中分别实现稀疏表示
    opencv2学习:计算协方差矩阵
    用python简单处理图片(3):添加水印
    Google protocol buffer在windows下的编译
    GEOS库学习之五:与GDAL/OGR结合使用
    GEOS库学习之四:几何关系判断
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4283520.html
Copyright © 2020-2023  润新知