序列化
序列化是一种用来处理对象流的机制。
所谓对象流:就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化:把java对象转换为字节序列的过程
反序列化:把字节序列恢复为java对象的过程
Java序列化机制是通过运行时判断类的序列号ID(SerialVersionUID)来判定版本的一致性。
在反序列化时,java虚拟机会通过二进制流中的SerialVersionUID与本地的对应的实体类进行比较,如果相同就认为是一致的,可以进行反序列化,正确获得信息,否则抛出序列化版本不一致的异常。
Seralizable无法序列化静态变量,使用transient修饰的对象也无法序列化。
当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable接口。
区别
1.Serializable是属于Java自带的,本质是使用了反射。序列化的过程比较慢,这种机制在序列化的时候会创建很多临时的对象,比引起频繁的GC。
2.Parcelable是安卓特有的序列化API,它的出现是为了解决Serializable序列化的过程中消耗资源严重的问题。实现原理是在内存中建立一块共享数据块,序列化和反序列化均是操作这一块的数据。
3.如果在内存中使用建议Parcelable。持久化操作建议使用Serializable。另外Parcelable的读写顺序必须一致
Parcelable的三个过程:序列化,反序列化和描叙
1.序列化:
/**
* Flatten this object in to a Parcel.
*
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
* May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
*/
public void writeToParcel(Parcel dest, @WriteFlags int flags);
2.反序列化
/**
* Interface that must be implemented and provided as a public CREATOR
* field that generates instances of your Parcelable class from a Parcel.
*/
public interface Creator<T> {
/**
* Create a new instance of the Parcelable class, instantiating it
* from the given Parcel whose data had previously been written by
* {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.
*
* @param source The Parcel to read the object's data from.
* @return Returns a new instance of the Parcelable class.
*/
public T createFromParcel(Parcel source);
/**
* Create a new array of the Parcelable class.
*
* @param size Size of the array.
* @return Returns an array of the Parcelable class, with every entry
* initialized to null.
*/
public T[] newArray(int size);
}
3.描述
/**
* Describe the kinds of special objects contained in this Parcelable
* instance's marshaled representation. For example, if the object will
* include a file descriptor in the output of {@link #writeToParcel(Parcel, int)},
* the return value of this method must include the
* {@link #CONTENTS_FILE_DESCRIPTOR} bit.
*
* @return a bitmask indicating the set of special object types marshaled
* by this Parcelable object instance.
*/
public @ContentsFlags int describeContents();
网友评论