当前位置: 首页 > 面试题库 >

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

颜瀚漠
2023-03-14
问题内容

我正在阅读 有效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接口并需要
在序列化和反序列化过程中进行特殊特殊处理的类必须实现
这些方法,而序列化器/反序列化器将尝试 反映 这些方法。

这是Java中实际上是在javaDoc中定义API的一个相当奇怪的角落…但是, 如果 方法是在接口中定义的,那么它们
必须是public(我们无法实现接口方法的锁定)通过添加private修饰符)。

为什么私有 -javaDoc没有给出提示。也许将它们 指定 为私有的,因为除了实现者之外,没有其他类打算使用它们。 根据定义, 它们是
私有的

(2)的例子只显示 了如何
特殊处理工作。在此示例中,size是瞬态的,不会被序列化。但是现在我们引入了特殊的处理程序,该处理程序将的值添加size到流中。与非瞬态字段的常规方法的区别可能是结果流中元素的顺序(如果重要的话…)。

如果在超类中定义了瞬态字段,而子类想要对值进行序列化,则该示例可能有意义。



 类似资料:
  • 问题内容: 为什么Java有瞬态字段? 问题答案: 在中关键字用于指示字段不应该是系列化的一部分(这意味着保存,像一个文件)的过程。 从Java语言规范,Java SE 7中版,第8.3.1.3节。transient领域: 可以标记变量transient以指示它们不是对象持久状态的一部分。 例如,你可能具有从其他字段派生的字段,并且仅应以编程方式进行操作,而不要通过序列化来保持状态。 这是一个包含

  • 本文向大家介绍GC是什么? 为什么要有GC?相关面试题,主要包含被问及GC是什么? 为什么要有GC?时的应答技巧和注意事项,需要的朋友参考一下 答 GC(Garbage Collection) GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: 当程序需要更多的堆空间时,GC需要进行垃圾清理工作,暂停所有线程,找出所有无被引用的对象,进

  • AWS VPC配置有4种场景。但让我们看看这两个: 场景1:1个公共子网。 场景2:1个公共子网和1个私有子网。 由于在公有子网中启动的任何实例都没有 EIP (除非已分配),因此它已无法从 Internet 寻址。然后: 为什么需要私有子网? 私有子网和公共子网到底有什么区别?

  • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这

  • 问题内容: 瞬态关键字将用于防止特定变量的序列化。但是为什么我们不应该序列化数据呢?有内部安全感吗? 问题答案: 有些类本质上是不可序列化的,因为它们表示Manage Java环境之外的资源。例如,a 不能真正序列化,因为它表示一个打开的文件句柄。对于a同样如此:您无法保存和恢复“打开的套接字”。 如果要序列化具有该类型字段的对象,则必须将这些字段标记为瞬态。 使用的另一个原因是您的类进行某种内部

  • 问题内容: 我是Java的新手,并且正在学习封装,并看到了一个示例,其中实例变量在类中声明为私有。 http://www.tutorialspoint.com/java/java_encapsulation.htm 我有2个查询: 为什么实例变量是私有的?为什么不公开? 如果实例变量被公开并直接访问怎么办?我们看到约束了吗? 您能用一个例子说明在Java类中将实例变量声明为public时会出现什么