`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)
方法,而不是 ObjectInputStream
的 readObject()
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());
}
我正在 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)
方法,而不是 ObjectInputStream
的 readObject()
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());
}