序列化是干什么的?
序列化的原本意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化到存储设备,避免程序运行结束后对象就从内存里消失,另外变换成字节序列便于网络运输和传播:
- 序列化:把Java对象转换为字节序列。
- 反序列化:把字节序列恢复为原先的Java对象。
1. java序列化通过实现Serializable接口:
public class Student implements Serializable {
private static final long serialVersionUID = 519067123721295773L;
private String name;
private Integer age;
private Integer score;
@Override
public String toString() {
return "Student:" + '\n' +
"name = " + this.name + '\n' +
"age = " + this.age + '\n' +
"score = " + this.score + '\n'
;
}
}
public static void serialize( ) throws IOException {
Student student = new Student();
student.setName("CodeSheep");
student.setAge( 18 );
student.setScore( 1000 );
ObjectOutputStream objectOutputStream =
new ObjectOutputStream( new FileOutputStream( new File("student.txt") ) );
objectOutputStream.writeObject( student );
objectOutputStream.close();
System.out.println("序列化成功!已经生成student.txt文件");
System.out.println("==============================================");
}
java反序列化:
public static void deserialize( ) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream =
new ObjectInputStream( new FileInputStream( new File("student.txt") ) );
Student student = (Student) objectInputStream.readObject();
objectInputStream.close();
System.out.println("反序列化结果为:");
System.out.println( student );
}
serialVersionUID:
serialVersionUID是序列化前后的唯一标识符;默认如果没有人为显式定义过serialVersionUID
,那编译器会为它自动声明一个。
serialVersionUID可以不声明。
如果类的结构和成员变量发生变化后serialVersionUID会发生变化,反序列化时会出错。所以,最好人为显式地为它声明一个。
2. Android使用Parcelable实现序列化
一个类,如果通过Parcelable实现类序列化,就可以实现序列化并可以通过Intent和Binder传递。
实现步骤:实现Parcel接口即可。
3.二者如何取舍?
Serializable使用简单,但是开销大,序列化和反序列化需要大量IO操作;
Parcelable 更适合在Android平台上,缺点是使用起来麻烦,但是效率很高,是官方推荐的序列化方式。
如果涉及到对象序列化存储到设备中或者将对象序列化后通过网络传输,更适合用Serializable实现。