【问题标题】: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)

【问题讨论】:

    标签: android serialization bitmap android-imageview serializable


    【解决方案1】:

    引起:java.io.NotSerializableException: android.graphics.Bitmap

    所以 Bitmap 不是可序列化的对象。您可以添加关键字transient 以告诉java不要序列化它

    private transient Bitmap Foto;
    

    来自thread

    Java中的transient关键字用来表示一个字段不应该被序列化。

    您还应该考虑在使用 Android 时使用Parcelable 而不是Serializable(请参阅此threaddoc

    使用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);
          }
      }
      

      希望它对你有用。

      【讨论】:

        猜你喜欢
        • 2018-01-15
        • 2013-05-10
        • 2018-04-18
        • 1970-01-01
        • 2013-04-30
        • 2020-07-22
        • 2014-08-03
        • 1970-01-01
        相关资源
        最近更新 更多