写入可序列化对象时出错(包括位图)
Posted
技术标签:
【中文标题】写入可序列化对象时出错(包括位图)【英文标题】:Error writing serializable object (bitmap include) 【发布时间】:2016-02-07 10:00:27 【问题描述】:我想按意图从 NewContact 类中将 Contacto 的项目保存在 RecyclerView 上。在我的 Contactos 类中,我有一个位图,我知道这是错误,因为之前没有位图可以工作。怎么了?
联系人类:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.Serializable;
public class Contactos implements Serializable
private String Nombre;
private String Apellidos;
private String Telefono;
private String Correo;
private Bitmap Foto;
public Contactos()
public Contactos(String nombre, String apellidos, String telefono, String correo)
Nombre = nombre;
Apellidos = apellidos;
Telefono = telefono;
Correo = correo;
public Contactos(String nombre, String apellidos, String telefono, String correo, Bitmap foto)
Nombre = nombre;
Apellidos = apellidos;
Telefono = telefono;
Correo = correo;
Foto = foto;
public String getNombre()
return Nombre;
public void setNombre(String nombre)
Nombre = nombre;
public String getApellidos()
return Apellidos;
public void setApellidos(String apellidos)
Apellidos = apellidos;
public String getTelefono()
return Telefono;
public void setTelefono(String telefono)
Telefono = telefono;
public String getCorreo()
return Correo;
public void setCorreo(String correo)
Correo = correo;
public Bitmap getFoto()
return Foto;
public void setFoto(Bitmap foto)
Foto = foto;
和持有人类:
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class Holder extends RecyclerView.ViewHolder
TextView txtnombre;
TextView txtapellido;
TextView txttelefono;
TextView txtemail;
ImageView iVFoto;
public Holder(View itemView)
super(itemView);
txtnombre = (TextView)itemView.findViewById(R.id.txtNombre);
txtapellido = (TextView)itemView.findViewById(R.id.txtApellidos);
txttelefono = (TextView)itemView.findViewById(R.id.txtTelefono);
txtemail = (TextView)itemView.findViewById(R.id.txtCorreo);
iVFoto = (ImageView)itemView.findViewById(R.id.foto);
public void bind(Contactos c)
txtnombre.setText(c.getNombre());
txtapellido.setText(c.getApellidos());
txttelefono.setText(c.getTelefono());
txtemail.setText(c.getCorreo());
//iVFoto.setImageDrawable(new BitmapDrawable(getResources(), c.getFoto())); me marca en ROJO getResources() y me pone que está en desuso(tachado) BitmapDrawable
iVFoto.setImageDrawable(new BitmapDrawable(c.getFoto()));
public TextView getTxtnombre()
return txtnombre;
public TextView getTxtapellido()
return txtapellido;
public TextView getTxttelefono()
return txttelefono;
public TextView getTxtemail()
return txtemail;
public ImageView getiVFoto()
return iVFoto;
还有日志猫
11-06 10:04:48.185 28245-28245/com.example.jorge.ejerciciopropuestoagenda E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.jorge.ejerciciopropuestoagenda, PID: 28245
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.jorge.ejerciciopropuestoagenda.Contactos)
at android.os.Parcel.writeSerializable(Parcel.java:1394)
at android.os.Parcel.writeValue(Parcel.java:1341)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.content.Intent.writeToParcel(Intent.java:7496)
at android.app.ActivityManagerProxy.finishActivity(ActivityManagerNative.java:2725)
at android.app.Activity.finish(Activity.java:4662)
at android.app.Activity.finish(Activity.java:4680)
at com.example.jorge.ejerciciopropuestoagenda.NuevoContacto.onClick(NuevoContacto.java:55)
at android.view.View.performClick(View.java:4785)
at android.view.View$PerformClick.run(View.java:19884)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.io.NotSerializableException: android.graphics.Bitmap
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at android.os.Parcel.writeSerializable(Parcel.java:1389)
at android.os.Parcel.writeValue(Parcel.java:1341)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.content.Intent.writeToParcel(Intent.java:7496)
at android.app.ActivityManagerProxy.finishActivity(ActivityManagerNative.java:2725)
at android.app.Activity.finish(Activity.java:4662)
at android.app.Activity.finish(Activity.java:4680)
at com.example.jorge.ejerciciopropuestoagenda.NuevoContacto.onClick(NuevoContacto.java:55)
at android.view.View.performClick(View.java:4785)
at android.view.View$PerformClick.run(View.java:19884)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
【问题讨论】:
【参考方案1】:引起:java.io.NotSerializableException: android.graphics.Bitmap
所以 Bitmap 不是可序列化的对象。您可以添加关键字transient
以告诉java不要序列化它
private transient Bitmap Foto;
来自thread
Java中的transient关键字用来表示一个字段不应该被序列化。
您还应该考虑在使用 Android 时使用Parcelable
而不是Serializable
(请参阅此thread 和doc)
使用Parcelable
,您可以使用(来自[这里]'How To: Parcel a bitmap in Android))存储/检索位图
//Store
Parcel parcel = Parcel.obtain();
Bitmap sourceBitmap = Bitmap.createBitmap(200, 400, Config.ARGB_8888);
sourceBitmap.writeToParcel(parcel, 0);
//Retrieve
parcel.setDataPosition(0);
Bitmap destinationBitmap = Bitmap.CREATOR.createFromParcel(parcel);
【讨论】:
【参考方案2】:因为使用Serializable 不支持Bitmap,如果你使用Serializable 你需要将其转换成
bmp.compress(Bitmap.CompressFormat.PNG, 90,outputStream);
否则最好使用 Parcelable:
public class Contactos implements Parcelable
private String Nombre;
private String Apellidos;
private String Telefono;
private String Correo;
private Bitmap Foto;
public Contactos()
public Contactos(String nombre, String apellidos, String telefono, String correo)
Nombre = nombre;
Apellidos = apellidos;
Telefono = telefono;
Correo = correo;
public Contactos(String nombre, String apellidos, String telefono, String correo, Bitmap foto)
Nombre = nombre;
Apellidos = apellidos;
Telefono = telefono;
Correo = correo;
Foto = foto;
protected Contactos(Parcel in)
Nombre = in.readString();
Apellidos = in.readString();
Telefono = in.readString();
Correo = in.readString();
Foto = in.readParcelable(Bitmap.class.getClassLoader());
public static final Creator<Contactos> CREATOR = new Creator<Contactos>()
@Override
public Contactos createFromParcel(Parcel in)
return new Contactos(in);
@Override
public Contactos[] newArray(int size)
return new Contactos[size];
;
public String getNombre()
return Nombre;
public void setNombre(String nombre)
Nombre = nombre;
public String getApellidos()
return Apellidos;
public void setApellidos(String apellidos)
Apellidos = apellidos;
public String getTelefono()
return Telefono;
public void setTelefono(String telefono)
Telefono = telefono;
public String getCorreo()
return Correo;
public void setCorreo(String correo)
Correo = correo;
public Bitmap getFoto()
return Foto;
public void setFoto(Bitmap foto)
Foto = foto;
@Override
public int describeContents()
return 0;
@Override
public void writeToParcel(Parcel dest, int flags)
dest.writeString(Nombre);
dest.writeString(Apellidos);
dest.writeString(Telefono);
dest.writeString(Correo);
dest.writeParcelable(Foto, flags);
希望它对你有用。
【讨论】:
以上是关于写入可序列化对象时出错(包括位图)的主要内容,如果未能解决你的问题,请参考以下文章
Parcelable 在写入可序列化对象时遇到 IOException ......?
Serializable Parcelable 问题:RuntimeException: Parcelable 在写入可序列化对象时遇到 IOException
获取 Parcelable 遇到 IOException 写入可序列化对象