Android开发篇之对象序列化

#Android开发篇之对象序列化

这里写图片描述

什么是序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。而Serializable和Parcelable接口就可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。还有的时候我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,这个时候也需要使用Serializable来完成对象的持久化。

下面会分别来简单介绍一下Serializable和Parcelable接口的用法:

目录


##Serializable接口

1. 实现序列化

public class User implements Serializable {

    private static final long serialVersionUID = 8711368828010083044L;

    private String Id;

    private String Name;

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }
}

(注:这里的serialVersionUID的值是手动指定,如果没有指定,则由编译器根据当前类的结构自动去生成它的hash值,这样序列化和反序列化时两者的serialVersionUID是相同的,因此可以正常进行反序列化。如果不手动指定serialVersionUID的值,反序列化时当前类有所改变,比如增加或者删除了某些成员变量,那么系统就会重新计算当前类的hash值并把它赋值给serialVersionUID,这个时候当前类的serialVersionUID就和序列化的数据中的serialVersionUID不一致,于是反序列化失败。)

2. 对象序列化过程

User user = new User();
user.setId(editText1.getText().toString());
user.setName(editText2.getText().toString());
try {
      ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(CacheDir + "cache.txt"));
      out.writeObject(user);
      out.close();
} catch (IOException e) {
      e.printStackTrace();
}

3. 对象反序列化过程

try {
      ObjectInputStream in = new ObjectInputStream(new FileInputStream(CacheDir + "cache.txt"));
      User user = (User)in.readObject();
      editText1.setText(user.getId());
      editText2.setText(user.getName());
      in.close();
} catch (IOException e) {
      e.printStackTrace();
} catch (ClassNotFoundException e) {
      e.printStackTrace();
}

Parcelable接口

1. 实现序列化

public class User implements Parcelable{

    private String Id;
    private String Name;

    public User(){
        Id = "";
        Name = "";
    }

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(Id);
        out.writeString(Name);
        //out.writeInt(number);
        //out.writeInt(isBool?1:0);
        //out.writeParcelable(obejct,0);
    }

    protected User(Parcel in) {
        Id = in.readString();
        Name = in.readString();

        //isBool = in.readInt() == 1;
        //object = in.readParcelable(Thread.currentThread().getContextClassLoader());
    }
}

2. 对象序列化过程

User user = new User();
user.setId(editText1.getText().toString());
user.setName(editText2.getText().toString());

Intent intent = new Intent(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user",user);
intent.putExtras(bundle);
startActivity(intent);

3. 对象反序列化过程

 User user = (User) getIntent().getParcelableExtra("user");

##Serializable与Parcelable的区别

Serializable是Java中的序列化接口,其使用起
来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适用于Android平台上,它的缺点就是使用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此在用于Intent间的数据传递时我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列号和到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程会稍微复杂,因此在这两种情况下建议大家使用Serializable。

序列化方式Intent间的数据传递对象存储到存储设备网络传输
Serializable
Parcelable
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值