📅  最后修改于: 2023-12-03 15:01:30.760000             🧑  作者: Mango
Java IO-ObjectStream是Java IO的一部分,可以方便的将Java对象序列化为字节流,也可以将字节流反序列化为Java对象。ObjectStream提供了两个类:ObjectInputStream和ObjectOutputStream来实现对象的读写。
序列化将Java对象转化为字节流,反序列化将字节流转化为Java对象。序列化和反序列化可以通过ObjectOutputStream和ObjectInputStream来实现。
序列化:
try {
FileOutputStream fileOut = new FileOutputStream("employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(employee);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in employee.ser");
} catch (IOException i) {
i.printStackTrace();
}
反序列化:
try {
FileInputStream fileIn = new FileInputStream("employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Employee e = (Employee) in.readObject();
in.close();
fileIn.close();
System.out.println(e.toString());
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
Java中所有要序列化的对象必须实现Serializable接口。
public class Employee implements Serializable {
public String name;
public String address;
public transient int ssn;
public int number;
public void mailCheck() {
System.out.println("Mailing a check to " + name + " " + address);
}
}
可以看到,这个Employee类实现了Serializable接口。
如果一个类中有某个属性不需要序列化,可以加上transient关键字,这样在序列化时该属性不会被序列化。
public transient int ssn;
Java运行时为每个Serializable类计算一个唯一的UID,这个UID在反序列化时用来验证是否是同一个类。如果这个类没有显式的定义UID,Java运行时将使用默认的计算方式生成UID。
可以使用serialver命令来查看这个类的UID。
Java IO-ObjectStream可以方便地实现Java对象的序列化和反序列化,只需要实现Serializable接口、使用ObjectOutputStream类进行序列化、使用ObjectInputStream类进行反序列化即可。另外,如果某个类中的属性不需要序列化,可以使用transient关键字标记。UID则用来在反序列化时验证是否是同一类。