a.什么是数据序列化?
b.数据序列化有什么作用?
c.如何实现序列化?
a.什么是数据序列化?
序列化是将对象转化为可传输或可存储的数据格式过程。
b.数据序列化有什么作用?
在Android应用中,intent对象传值,本地数据存储,网络数据传输和进程间通信都需要序列化。
c.如何实现序列化?
(1)Serializable
Serializable是Java语言的特性。它是一个标记接口,没有方法。在创建类时,实现这个接口即可。
它的缺点是,使用反射机制,在序列化过程中会创建很多临时对象,容易触发垃圾回收,序列化过程慢。
public class Person implements Serializable {
private static final long serialVersionUID = 12345678910L;
private String name;
private String address;
private int age;
public Person(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
}
serialVersionUID的作用是什么?
serialVersionUID是用来辅助序列化和反序列化过程的。序列化的时候系统会把当前类的serialVersionUID写入序列化的文件中。当反序列化的时候系统会去检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致。如果一致就说明序列化的类与当前类的版本相同。否则会报错误。
例子:序列化
val person = Person("小王","马达加斯加半岛",25)
val out = ObjectOutputStream(FileOutputStream("E:\\cache.txt"))
out.writeObject(person)
out.close()
对对象的序列化和反序列化需要用到ObjectOutputStream和ObjectInputStream这两个类。
例子:反序列化
val input = ObjectInputStream(FileInputStream("E:\\cache.txt"))
val person :Person = input.readObject() as Person
input.close()
println(person)
(2)Parcelable
Parcelable是Android SDK提供的。它是作用于内存的,不同于Serializable是作用于磁盘或网络的。
Parcelable常被用于Android跨进程对象的传递。
public class User implements Parcelable {
private String name;
private String address;
private int sex;
private int age;
protected User(Parcel in) {
this.name = in.readString();
this.address = in.readString();
this.sex = in.readInt();
this.age = in.readInt();
}
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 dest, int flags) {
dest.writeString(this.name);
dest.writeString(this.address);
dest.writeInt(this.sex);
dest.writeInt(this.age);
}
}
describeContents():接口内容描述,一般返回0
writeToParcel(Parcel dest, int flags):序列化方法,将类的数据写入到Pacel容器中
CREATOR.createFromParcel :反序列化的方法,将Parcel还原成Java对象
CREATOR.newArray :提供给外部类反序列化这个数组使用