我正在阅读有关序列化的章节有效的Java.
谁调用了 readObject() 和 writeObject()?为什么这些方法被声明为私有?
-
下面是书中的一段代码
// StringList with a reasonable custom serialized form
public final class StringList implements Serializable {
private transient int size = 0;
private transient Entry head = null;
//Other code
private void writeObject(ObjectOutputStream s)
throws IOException {
s.defaultWriteObject();
s.writeInt(size);
// Write out all elements in the proper order.
for (Entry e = head; e != null; e = e.next)
s.writeObject(e.data);
}
}
}
变量有什么具体原因吗size
被声明为瞬态,然后在 writeObject 方法中显式写入?如果它没有被声明为瞬态,它无论如何都会被写入,对吗?
(1) 方法未在任何类或接口中声明。一个类,它实现了Serializable
接口和要求序列化和反序列化过程中的特殊特殊处理必须实现 http://download.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html这些方法和序列化器/反序列化器将尝试reflect那些方法。
这是 Java 中相当奇怪的角落之一,API 实际上是在 javaDoc 中定义的......但是if这些方法已在接口中定义,然后它们had to be public
(我们不能实现一个接口方法并通过添加一个来锁定它private
修饰符)。
为什么是私人的- javaDoc 没有给出提示。也许他们是指定的为私有,因为除了实现者之外没有其他类打算使用它们。他们是根据定义是私有的.
(2) 例子简单说明how特殊处理工程。在这个例子中,size
是暂时的,不会被序列化。但现在我们引入了特殊的处理程序,该处理程序添加了以下值size
到溪流。与非瞬态字段的正常方法的区别可能是结果流中元素的顺序(如果重要的话......)。
如果瞬态字段是在超类中定义的并且子类想要序列化该值,则该示例是有意义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)