为什么 readObject 和 writeObject 是私有的,为什么我要显式写入瞬态变量?

2024-03-11

我正在阅读有关序列化的章节有效的Java.

  1. 谁调用了 readObject() 和 writeObject()?为什么这些方法被声明为私有?

  2. 下面是书中的一段代码

    // 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(使用前将#替换为@)

为什么 readObject 和 writeObject 是私有的,为什么我要显式写入瞬态变量? 的相关文章

随机推荐