1.java序列化与反序列化的概念
- 序列化
将数据结构或者对象转化为二进制的过程 - 反序列化
将在序列化过程中生成的二进制转化为数据结构或者对象的过程 - 持久化
把数据结构或者对象存储起来 比如:硬盘
序列化方案:
1.Serializable Java的序列化方案
2.Parcelable Android独有
3.json xml protbuf ... 广义的序列化
2.Serializable接口及使用实例
1.Serializable是一个接口
public interface Serializable {
}
- Serializable序列化
/**
* 序列化对象 ** @param obj * @param path * @return
*/
synchronized public static boolean saveObject(Object obj, String path) {
if (obj == null) {
return false;
}
ObjectOutputStream oos = null;
try {
// 创建序列化流对象
oos = new ObjectOutputStream(new FileOutputStream(path));
//序列化
oos.writeObject(obj);
oos.close();
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
// 释放资源
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
- Serializable反序列化
synchronized public static <T> T readObject(String path) {
ObjectInputStream ojs = null;
try {
// 创建反序列化对象
ojs = new ObjectInputStream(new FileInputStream(path));
// 还原对象
return (T) ojs.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ojs != null) {
try {// 释放资源
ojs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
2.Externalizable 是Serializable的一个子类
public interface Externalizable extends Serializable {
void writeExternal(ObjectOutput var1) throws IOException;
void readExternal(ObjectInput var1) throws IOException,
}
3.序列化面试常见问题
- 什么是SerialVersionUID?如果不定义这个,会发生什么?
序列化对象的版本号
如果修改序列化对象的数据,可能会导致异常
2.序列化时,如何不序列化某些变量不序列化
transient 关键字
3.如果对象没有实现Serializable接口,去序列化会出现什么情况?
会报错 NoSerializableException
4.序列化源码流程解析
序列化流程 判断对象中是否写了readObject和writeObject
5.android的Parcelable相关概念
Binder通信机制6.Parcelable与Serializable的性能比较
- Serializable性能分析
Serializable是Java中的序列化接口,其使用起来简单但开销较大(因为Serializable在序列化过程中使
用了反射机制,故而会产生大量的临时变量,从而导致频繁的GC),并且在读写数据过程中,它是通
过IO流的形式将数据写入到硬盘或者传输到网络上。 -
Parcelable性能分析
Parcelable则是以IBinder作为信息载体,在内存上开销比较小,因此在内存之间进行数据传递时,推荐使用Parcelable,而Parcelable对数据进行持久化或者网络传输时操作复杂,一般这个时候推荐使用
Parcelable与Serializable比较
网友评论