📜  Java IO-ObjectStream(1)

📅  最后修改于: 2023-12-03 15:01:30.760000             🧑  作者: Mango

Java IO-ObjectStream

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;
}
实现Serializable接口

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关键字

如果一个类中有某个属性不需要序列化,可以加上transient关键字,这样在序列化时该属性不会被序列化。

public transient int ssn;
UID

Java运行时为每个Serializable类计算一个唯一的UID,这个UID在反序列化时用来验证是否是同一个类。如果这个类没有显式的定义UID,Java运行时将使用默认的计算方式生成UID。

可以使用serialver命令来查看这个类的UID。

总结

Java IO-ObjectStream可以方便地实现Java对象的序列化和反序列化,只需要实现Serializable接口、使用ObjectOutputStream类进行序列化、使用ObjectInputStream类进行反序列化即可。另外,如果某个类中的属性不需要序列化,可以使用transient关键字标记。UID则用来在反序列化时验证是否是同一类。