序列化和bitmap序列化

记录一下,遇到的问题。activity之间intent传递数据,需要将对象序列化,同时一个对象中带有bitmap。百度了一下,很多序列化的文章,解决了自己的问题。

序列化

现在我尝试的序列化有两种:一种是java的序列化Serializable,一种是Android的序列化Parcelable。

Parcelable的性能相比Serializable要高,但是使用起来没有那么的简单。

1、Serializable序列化

​ 类只要implement Serializable接口即可。同时,在类中需要声明一个标识serialVersionUID,如下所示:

private static final long serialVersionUID = 12907898L;

这样就好了。如果,不加这个UID也可以。但是,类中少了一个属性的话,程序就会崩溃。如果加了,程序不会崩溃。

序列化:

User person = new User();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(person);
out.close()

反序列化:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
User user = in.readObject(user);
in.close();

Intent传递:

intent.putExtra("personInfo", bean);

User person = getIntent().getSerializableExtra("personInfo");
2、Parcelable序列化,bitmap的序列化

实现Parcelable接口,同时参照网上的教程实现bitmap的序列化,如下示例:

public class Person implements Parcelable {
    
    //此处为静态变量。序列化时,初始化了。反序列时,还可以用。
  private static byte[] bytes;
    
  private Bitmap headBitmap; //头像
  private String level; //职位
  private String name; //姓名
  
  ......

  @Override
  public int describeContents() {
        return 0;
  }

    //对象写成序列,这些属性都是顺序的
  @Override
  public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(head_url);
        bytes = getBytesFromBitmap(headBitmap);
        dest.writeByteArray(bytes);
        dest.writeString(level);
        dest.writeString(name);
  }
    
    //序列转成对象
  public static final Creator CREATOR = new Creator() {
        @Override
        public Object createFromParcel(Parcel source) {
            return new PersonBean(source);
        }

        @Override
        public Object[] newArray(int size) {
            return new PersonBean[size];
        }
   };
   
   private PersonBean(Parcel in){
        in.readByteArray(bytes);
        headBitmap = getBitmapFromArrayBytes(bytes);
        level = in.readString();
        name = in.readString();
    }
    
    //bitmap转byte
    private byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream outputStream = 
            new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
        return outputStream.toByteArray();
    }

    //byte转bitmap
    private Bitmap getBitmapFromArrayBytes(byte[] bytes){
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }
}

Intent传递:

intent.putExtra("personInfo", bean);

User person = getIntent().getParcelableExtra("personInfo");

参照bitmap序列化:https://www.cnblogs.com/Free-Thinker/p/4635170.html

原文地址:https://www.cnblogs.com/wisdomzhang/p/12060732.html