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

面试问题:关于Java序列化和单例[关闭]

戈宏义
2023-03-14
问题内容

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。

8年前关闭。

在一次采访中,面试官问我以下问题:是否可以序列化单例对象?我说可以,但是在哪种情况下我们应该序列化一个单例呢?

并且可以设计一个其对象无法序列化的类吗?


问题答案:

这个问题应该更好地表述为“是否可以以不破坏单例模式的方式对单例模式 C 类使用序列化和反序列化?”

答案基本上是:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;

public class AppState implements Serializable
{
    private static AppState s_instance = null;

    public static synchronized AppState getInstance() {
        if (s_instance == null) {
            s_instance = new AppState();
        }
        return s_instance;
    }

    private AppState() {
        // initialize
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject();
        synchronized (AppState.class) {
            if (s_instance == null) {
                // re-initialize if needed

                s_instance = this; // only if everything succeeds
            }
        }
    }

    // this function must not be called other than by the deserialization runtime
    private Object readResolve() throws ObjectStreamException {
        assert(s_instance != null);
        return s_instance;
    }

    public static void main(String[] args) throws Throwable {
        assert(getInstance() == getInstance());

            java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
            java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
            oos.writeObject(getInstance());
            oos.close();

            java.io.InputStream is = new java.io.ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(is);
            AppState s = (AppState)ois.readObject();
            assert(s == getInstance());
    }
}

但要注意,它
可能的多个实例AppState来使用此代码存在。但是,仅引用一个。其他的则有资格进行垃圾回收,仅由反序列化运行时创建,因此它们不存在实际用途。

有关其他两个问题的答案(我们应该在哪种情况下序列化一个单例?是否可以设计一个不能序列化对象的类?),请参阅@Michael
Borgwardt的答案



 类似资料:
  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 刚开始学习java大约一个月,我对arraylist和oop有几个问题 这个arraylist允许我将字符串添加到列表中并存储它,但是如果我有一个类调用簿呢 这三者有什么区别?假设我有大量的输入,比如文件 我有一个班级运动 我该怎么做呢?所以我用许多参数来添加这些输入,因为如果我想添加,我通常会这样做 我也会去

  • 本文向大家介绍php面试中关于面向对象的相关问题,包括了php面试中关于面向对象的相关问题的使用技巧和注意事项,需要的朋友参考一下 PHP中面向对象常考的知识点有以下7点,我将会从以下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题。 整个面向对象文章的结构涉及的内容模块有: 一、面向对象与面向过程有什么区别? 二、面向对象有什么特征? 三、什么是构造函数和析构函数

  • 过去几天我一直在使用java,最近几天我收到了一个问题表单。当我试图在servlet中创建一个类时,包部分显示以下错误"** > 无法解析ObjectInputStreamjava.io.类型。它是从必需的. class文件间接引用的 当我试着评论出 导入javax.servlet.http.HttpServlet; **"部分的错误是去,但我不能扩展的http的servlet类。 此图像显示错误

  • 作为一个 Python 新手,你必须熟悉基础知识。在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试。包括 Python 开发问题、编程问题、数据结构问题、和 Python 脚本问题。让我们来深入研究这些问题。

  • 我试图在java中为Mandelbrot集编程一个可视化,有几件事我正在努力编程。我意识到围绕这个主题的问题已经被问了很多,网上有很多留档,但是很多事情看起来很复杂,我对编程相对来说是新手。 我的第一个问题是放大分形。我的目标是对分形进行“无限”缩放(当然不是无限的,只要普通计算机在计算时间和精度方面允许)。我目前采用的方法是以下计时器: 在实轴(-2,2)和虚轴(2,2)范围内使用一定次数的迭代

  • 我想要一个显示阿尔巴尼亚2000年所有疾病数量的柱状图。 我试过了,但我得不到我想要的。