Serializable(Java自带):
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象
可以在网络上进行传输,也可以存储到本地。
Parcelable(android 专用):
除了Serializable之外,使用Parcelable也可以实现相同的效果,
不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,
而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临
时对象,容易触发垃圾回收。
在Android中实现Parcelable接口序列化,以下是一个实现的步骤和举例:
1. 实现Parcelable接口
2. 添加实体属性
3. 覆写writeToParcel(Parcel dest, int flags)方法,指定写入Parcel类的数据。
4. 创建Parcelable.Creator静态对象,有两个方法createFromParcel(Parcel in)与newArray(int size),
前者指定如何从Parcel中读取出数据对象,后者创建一个数组
5. 覆写describeContents方法,默认返回0。
public class User implements Parcelable {
private String name;
private String IdCard;
private int age;
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
User user = new User();
user.age = in.readInt();
user.IdCard = in.readString();
user.name = in.readString();
return new User();
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(IdCard);
parcel.writeInt(age);
}
}
序列化与反序列化uuid问题:(serializable)
uuid相当于版本号 反编译的时候会找对应的版本号进行反编译
手动添加uuid,反序列化时即使对象类变化也不会报错。
不手动添加uuid,会自动为其添加uuid,对象类改变,反序列化的时候就会报错。原因是自动添加的uuid来自于计算对象类的成员,类成员发生变化,反序列化的时候uuid与修改后的对象类不符将会报错
Transient:(关键字)
为变量添加该关键字,该变量将不会被序列化
联系客服