对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存 储的属性等信息
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
构造方法:ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
序列化对象的方法:void writeObject(Object obj):将指定的对象写入ObjectOutputStream.
注意:
一个对象想要被序列化,该对象所属的类必须实现Serializable接口
Serializable是一个标记接口,实现此接口,不需要重写任何方法
例如
public class Employee implements Serializable {...}
序列化:
public static void main(String[] args) {
try(
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.txt"));
) {
Employee employee = new Employee("Tom","市场部", 9000);
oos.writeObject(employee);
} catch (IOException e) {
e.printStackTrace();
}
}
反序列化://结果:
public class DeSerialization {
public static void main(String[] args) {
try(
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("employee.txt"));
) {
Object obj = ois.readObject();
Employee employee = (Employee) obj;
System.out.println(employee.getName() + "," + employee.getDepartment() + "," + employee.getSalary());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
注意:反序列化时,强烈建议在需要序列化的类(如上面用到的Employee类)里面加入serialVersionUID,此序列化UID是双方的暗号。
如:private static final long serialVersionUID = 32L(举例的数字);
对于不想被序列化的属性,可以加入transient关键字:private transient int salary;