`private void readObject(ObjectInputStream stream)` return 如何在 Java 中自定义序列化对象?

How does `private void readObject(ObjectInputStream stream)` return an object in custom serialization in Java?

我正在 Java 中阅读有关 custom serialization 的内容,您在其中提供了以下两种要序列化的 class 方法:

private void writeObject(ObjectOutputStream oos)
private void readObject(ObjectInputStream ois)

例如:

public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    private transient Address address;
    private Person person;

    // setters and getters

    private void writeObject(ObjectOutputStream oos) 
      throws IOException {
        oos.defaultWriteObject();
        oos.writeObject(address.getHouseNumber());
    }

    private void readObject(ObjectInputStream ois) 
      throws ClassNotFoundException, IOException {
        ois.defaultReadObject();
        Integer houseNumber = (Integer) ois.readObject();
        Address a = new Address();
        a.setHouseNumber(houseNumber);
        this.setAddress(a);
    }
}

当你想反序列化classEmployee的序列化对象时如下:

Employee e2 = (Employee) objectInputStream.readObject();

Java 虚拟机将调用 class Employee 中定义的 readObject(ObjectInputStream ois) 方法,而不是 ObjectInputStreamreadObject() class (source)。然而,前一种方法没有 return 任何东西(void),不像后一种方法 return 是一个 Object 类型(应该被转换)。

那么,我们如何从上面的自定义反序列化过程中得到 Employee 对象呢?

你不会因为这个方法而得到任何额外的对象 - readObject 方法不是静态的并且 运行 你需要有实例(比如说 Employee class) 并且 - 这是你的对象。

看看这个例子 from this tutorial - 你在那里做的实际上是设置 this object

的字段
private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException 
{       
    firstName = aInputStream.readUTF();
    lastName = aInputStream.readUTF();
    accountNumber = aInputStream.readInt();
    dateOpened = new Date(aInputStream.readLong());
}