Android中序列化Serializale与Parcelable笔记
Serializale接口
Serializale是java提供的序列化接口,为对象提供标准的序列化和反序列化操作。
//implement Serializable接口
//实现方式
privte static final long serialVersionUID = *****************L;
serialVersionUID并不是必须的,如果不生明UID也同样可以实现序列化,但是会对反序列化过程产生影响。
serialVersionUID是用来辅助序列化和反序列化的过程的,原则上序列化后的数据中serialVersionUID只有和当前类的serialVersionUID相同才能够正常的被反序列化。
基本原理:序列化时候系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候系统回去检测文件中的serialVersionUID,看它是否与当前类的serialVersionUID一致,如果一致说明版本是相同的,此时可以成功反序列化,否会发生变化,无法正常反序列化.
-
静态成员变量属于类不属于对象,所以不会参与序列化的过程
-
用transient关键字标记的成员变量不参与序列化过程
-
系统默认序列化过程是可以改变的,通过重写系统默认的序列化和反序列化过程
private void writeObject(java.io.ObjectOutputStream out) throws IOException{ // } private void readObject() throws IOExcepton, ClassNotFoundException{ // }
无法正常序列化时候报错内容
//无法正常序列化时候报错
java.io.InvalidClassException: Main; local class incompatible: stream classdesc serialVersionUID = ***,local class serialVersionUID = ***.
代码实现序列化的过程
//代码实现序列化和反序列化
//只要把实现了Serializable接口的User对象写到文件中就可以快速回复了
//恢复以后newUser和user内容完全一样,但是两者并不是一个对象
//序列化过程
User user = new User("","","");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
//反序列化过程
ObjectInputStream int new ObjectInputSteam(new FileInputStream("cache.txt"));
User newUser = (User)in.readObject();
in.close();
Parcelable接口
Parcelable也是一个接口只要实现这个接口,实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递. (具体实现参照网络)
Parcel 内部包装了可序列化的数据,可以在Binder中自由传输
方法 | 功能 | 标记位 |
---|---|---|
creatFromParcel(Parcel in) | 从序列化后的对象中创建原始对象 | |
newArray(int size) | 创建指定长度的原始对象数值 | |
User(Parcel in) | 从序列化后的对象中创建原始对象 | |
writeToParcel(Parcel out, int flags) | 将当前对象写入序列化结构中,其中flags标示有两种值:0或者1(参见右侧标记位)。为1时标示当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0 | PARCELABLE_WRITE_RETURN_CALUE |
describeContents | 返回当前对象的内容描述,如果含有文件描述符,返回1(参见右侧标记位),否则返回0,几乎所有情况都返回0 | CONTENT_FILE_DESCRIPTOR |
系统为我们提供了许多已经实现的Parcelable接口的类,他们都是直接序列化的,比如Intent,Bundle,Bitmap等,同时List和Map也可以序列化,前提是他们里面的元素都是可序列化的。
如何选取?
Serializable是java中的序列化接口,使用起来开销很大,序列化和反序列化操作需要大量的I/O操作。而Parcelable是android中的序列化方式,更适合在android平台上,缺点是使用起来有点麻烦,但是效率高。
Parcelable主要用在内存序列化上,将对象序列化到存储设备中或者将对象序列化后通过网络传输也都可以,但是过程稍微复杂因此在这两种情况下建议大家使用Serializable。
注意点
Activity中传值时需要注意传的对象的大小,一般不超过1M,和序列化的问题
网友评论