Java 序列化面试问题和答案 [适合初学者和有经验者]
已发表: 2020-09-25Java 是世界上最好的编程语言之一。 我们很幸运地看到 Java 随着时间的推移而发展并成为我们今天所知道的广受欢迎的语言。 这些在 Java 中进行的改进导致包含了一些非常重要的特性,这些特性定义了我们今天如何编写程序。 这些功能之一是序列化。
本质上,序列化只是一种用于将对象存储到内存中的机制。 因此,当我们说我们正在序列化一个对象时,我们的意思是我们正在将所讨论的对象从状态转换为字节流。 这种从其本机状态到字节流的转换使得将这个对象写入文件变得轻而易举。
然后可以将此文件传输到我们希望的任何地方,并且要访问对象及其功能,我们需要做的就是反序列化对象。 反序列化,顾名思义,是序列化的反面。 在这里,我们将字节的流转换为对象的本机状态以使用该对象。
序列化使开发人员能够以一定程度的灵活性编写他们的代码。 获取对象并将其与其他地方的原生属性一起使用的能力在当今的工作流程中至关重要。 难怪招聘人员希望他们的潜在员工更多地了解 Java 中的对象序列化。
无论您是否在项目中使用了序列化,您都不能仅仅让它的重要性滑落。 因此,为了帮助您成为一名专业的 Java 开发人员,我们收集了一些引人入胜的 Java 序列化面试问题,您将在下面找到这些问题。
Java 序列化面试题
Q1。 在 Java 编程语言的上下文中,序列化是什么意思?

答。 序列化的定义可能是 Java 序列化上下文中最基本但也是最常见的问题之一。 你将不得不回答这个问题几乎是所有的采访。 因此,您必须对 Java 序列化有一个好的定义。 因此,序列化只不过是用 Java 编写的对象如何转换为字节流。
这样做的主要目的是使对象能够转移到另一台机器或将对象的状态保存到文件中或将对象的状态保存到数据库中。 一旦对象被成功序列化,那么我们只需反序列化对象就可以快速将对象恢复到昔日的辉煌。
Q2。 我们可以在 Java 中序列化对象的方式是什么? 编写一个程序来序列化和反序列化对象。
答。 在面试中,如果你能够通过编写程序来增强你的理论知识,那么你被选中的机会就会自动增加。 还假设在任何面试中,您将被要求编写一个基本程序(至少是一个基本程序),它演示了序列化和反序列化是如何发生的。 在你自己编写这个程序之前,你需要记住关于 java 中对象序列化的一件关键事情。
要序列化一个对象,您需要编写使用类 java.io.Serializable 接口的对象。 您需要确保为要序列化的类对象使用 Marker 接口。 这意味着有问题的类在该类中不应有任何书面方法。 这个类还需要告诉 Java 虚拟机,随后的对象将不得不改变形式并形成字节流。
序列化的代码写在下面。
OutputStream fout = new FileOutputStream(“ser.txt”);
ObjectOutput oout = new ObjectOutputStream(fout);
系统。 out .println(“序列化过程已经开始,正在序列化员工对象……”);
out.writeObject(object1);
反序列化的代码写在下面。
InputStream fin= new FileInputStream(“ser.txt”);
ObjectInput oin= new ObjectInputStream(fin);
系统。 out .println(“反序列化过程已经开始,正在显示员工对象……”);
雇员雇员;
emp=(员工) oin.readObject();
学习: Java 中的内存分配:您需要知道的一切
Q3。 Serialization 和 Externalizable 的接口有什么区别?
答。 这个问题可能意味着您是否被选中担任该工作之间的区别。 假设您设法以非常全面的方式回答了这个问题。 在这种情况下,面试官一定会对你对这个学科的了解留下深刻的印象,你被选中的机会就会自动飙升。 您将在下表中找到所有关键差异:
我们比较这两种方法的属性。 | 可序列化 | 可扩展的 |
这两个不同接口的类中存在的方法 | 这恰好是一个标记界面。 标记接口不能有任何成员函数。 它们必须是空的,除了它们需要有一条指令,它告诉 Java 虚拟机这个类的对象必须被转换成字节流。 | 这不是制造商接口,这意味着它有一些成员方法。 它具有称为writeExternal()和readExternal()的方法 |
他们默认的序列化方式是什么? | 对于可序列化,您将找到一种可以序列化您编写的对象的默认方式。 作为一名程序员,你需要做的就是找到一种方法,将这个接口集成到你的程序中。 | 您将找不到实现序列化的默认方式。 您将需要编写自己的方法或覆盖现有的方法。 |
他们实现序列化过程的方式是什么? | 您可以自定义在此接口中实现序列化的方式。 但是,您不能覆盖现有方法。 您需要将这些方法实现到您自己的类中以获得您想要的自由度。 | 在此方法中,您需要覆盖默认方法。 所以如果你想实现一个自定义的方式来序列化对象,你应该选择这个接口而不是默认的 Serializable 方式。 |
他们在序列化过程中提供的控制程度如何, | 使用此界面时,您会发现一个很小的摆动空间。 您还需要将默认函数写入您的类以充分利用此方法。 但是,您不必这样做,这意味着您仍然可以使用此接口序列化对象,而无需将默认函数写入自定义类。 | 该界面提供了对整个过程的出色控制。 仅出于这个原因,如果您使用此接口,则必须将这两个方法写入您的自定义类。 |
使用反序列化时使用的构造函数是什么, | 在序列化过程中没有调用构造函数。 | 使用此接口序列化对象时,会调用承包商。 |
Q4。 编写一个程序,在其中实现序列化和反序列化的自定义过程。
答。 棘手的部分来了。 通过这个问题,您可以通过实际用例场景展示所有以前的问题知识。 您能够编写这些程序的能力将清楚地展示您的专业知识并帮助您获得想要的工作。
写在下面,您将找到编写 writeObject() 方法的自定义方式。
私人无效writeObject(ObjectOutputStream os){
系统。 out .println("In, writeObject() 方法。");

试试{
os.writeInt(这个.id);
os.writeObject(这个.name);
}捕捉(异常 e){
e.printStackTrace();
}
}
写在下面你会发现去序列化的自定义实现。
私人无效读取对象(ObjectInputStream ois){
系统。 out .println("In, readObject() 方法。");
试试{
id=ois.readInt();
名称=(字符串)ois.readObject();
}捕捉(异常 e){
e.printStackTrace();
}
}
Q5。 您将如何使用 Externalizable 接口实现序列化和反序列化?
答。 要使用 externalizable 接口实现序列化和反序列化,您需要自己编写函数 writeExternal() 和 readExternal()。 您将在下面找到两者的代码。
自定义 writeExternal() 方法
民众 空白 writeExternal (ObjectOutput oo)抛出IOException {
系统。 out .println(“in writeExternal()”);
oo.writeInt(id);
oo.writeObject(name);
}
自定义 readExternal() 方法
民众 空白 readExternal (ObjectInput in)抛出IOException,ClassNotFoundException {
系统。 out .println(“in readExternal()”);
这个.id=in.readInt();
这个.name=(String)in.readObject();
}
阅读: 2020 年的 Python 与 Java:您应该选择哪一个?
Q6。 假设您不希望序列化特定变量。 您将如何防止您不希望被序列化的成员变量?
答。 这是一个高度概念化的问题。 您需要了解静态和非静态变量才能快速回答这个问题。 假设您希望某个特定变量不被序列化。 在这种情况下,您必须将它们设为静态,因为任何静态变量的值都无法更改,因此,它们也不会被序列化。
问题 7。 serialVersionUID 是什么意思?
答。 对于我们想要序列化的每个类,它们将被赋予一个类号。 这个数字,给每个要序列化的类,称为serialVersionUID。 此 ID 是必不可少的,因为在以本机形式取回对象时,Java 虚拟机会查找与该对象关联的 ID。
然后它快速引用应该序列化的类的 ID。 当它找到这个对象所属的对应类时,反序列化过程就开始了。
Q8。 假设我们忘记提及或定义 serialVersionUID。 这个动作会对我们编写的程序产生什么影响?
答。 这个问题是另一个基本问题。 你需要一些扎实的知识才能正确回答这个问题。 我们首先需要澄清的是,serialVersionUID 用于对问题中的对象进行版本控制。 假设没有为该类定义 ID,因此 Java 编译器将不知道该对象属于哪个类。 在运行时或序列化对象时,不会出现任何错误,因为本身不需要定义任何 ID。

但是,当我们想要将数据流转换为对象时,Java 编译器就会抛出错误。 编译器将不知道该对象属于哪个类,因此无法找到并连接与该对象关联的所有成员函数和变量。 因为编译器会卡在这一步,会抛出serialVersionUID mismatch (java.io.InvalidClassException)的错误。
问题 9。 如果我们无法序列化,或者序列化方法不可用,是否有任何其他方法可以通过网络传输我们编写的对象?
答。 有几种方法可以让我们通过网络传输我们编写的对象。 您会在下面找到其中一些。
- 您可以尝试将对象转换为 JSON 文件。 将对象转换为 JSON 字符串并不难,当您编写好 JSON 文件后,将其转换为代码文件也不是很困难。 因此,您可以传输通过网络编写的 JSON 字符串。
- 您还可以使用 Hibernate 工具(这是一个 ORM 工具)。 该工具允许对象在数据库中持久存在。 然后写入的对象以后也可以很容易地读取。
- 您还可以使用 XML 技术。 您可以尝试将对象转换为 XML 文件,然后您可以通过网络快速传输该文件。
必读:前 24 个 Java 面试问题和答案
包起来
如果您有兴趣了解有关 Java、OOP 和全栈软件开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发 PG 文凭,该文凭专为在职专业人士设计,提供 500 多个小时的严格培训,9 + 项目和任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。