序列化是指java对象转换为字节序列的过程,反序列化是从文件中取出经过序列化的对象。
Serializable接口,用于标记此类可序列化,该类的所有属性都需要实现了该接口。
//序列化与反序列化
/*序列化,序列化类的属性都要实现序列化
A a = new A("name","金苹果");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D://a.txt"));
//NotSerializableException不可序列化异常,需要序列化对象类要实现serializable
out.writeObject(a);
out.close();*/
//反序列化
ObjectInputStream input = new ObjectInputStream(new FileInputStream("D://a.txt"));
//获得反序列化对象
A a =(A) input.readObject();
System.out.println(a.name);
System.out.println(a.info);
input.close();
}
static class A implements Serializable {
String name;
String info;
public A() {
}
public A(String name, String info) {
this.name = name;
this.info = info;
}
实现部分序列化方式
- 使用transient修饰符修饰的属性不参与序列化。
- 使用static修饰的属性不参与序列化。
- Serializable接口中复制俩个私有方法:writerObject和readerObject方法进行选择需要序列化的属性。
- Externalizable接口,重写俩个方法。
区别 | Serializable | Externalizable |
实现复杂度 | 实现简单,java对其内建支持(可以不创建方法执行序列化) | 实现复杂,又开发人员自己完成 |
执行效率 | 所有对象由java统一保存,性能较低 | 开发人员决定哪个对象保存,可能造成速度提升 |
保存信息 | 保存时占用空间大 | 部分存储,可能造成空间减少 |
使用频率 | 高 | 偏低 |
Serializable
既可以写下这俩个方法也可以不写下,底层会调用默认方法。
private String name;
private String age;
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
System.out.println("序列化");
out.writeObject(name);
out.writeObject(age);
out.close();
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
System.out.println("反序列化----");
name = (String) in.readObject();
age = (String) in.readObject();
in.close();
}
Externalizable
private String name;
private String age;
@Override
public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("序列化");
out.writeObject(name);
out.writeObject(age);
out.close();
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
System.out.println("反序列化----");
name = (String) in.readObject();
age = (String) in.readObject();
in.close();
}