通过Singleton Pattern创建Serializable对象会发生什么?

Tap*_*ose 3 java singleton object serializable

问题说了一切.有没有特别的事件发生?我有一个需要实现Serializable接口的类.我正在使用Wicket开发一个应用程序.我已经实现了一个Factory类,它将提供一些链接(以删除一遍又一遍地写入的相同代码块的冗余):

public class NavigationLinkFactory implements Serializable {

    private static final long serialVersionUID = 7836960726965363785L;

    private NavigationLinkFactory() {

    }

    private static class SingletonHolder { 
        public static final NavigationLinkFactory instance = new NavigationLinkFactory();
    }

    public static NavigationLinkFactory getFactory() {          
        return SingletonHolder.instance;

    }

    private Object readResolve() throws ObjectStreamException {
        return SingletonHolder.instance;
    }

    public Link<Serializable> getUserHomeLink() {
        return new Link<Serializable>("home", new Model<Serializable>()) {

            private static final long serialVersionUID = -8282608926361995521L;

            @Override
            public void onClick() {
                EMSSession session = (EMSSession) getSession();
                session.setActiveHorizonalMenu(1);
                setResponsePage(HomePage.class);
            }
        };      
    }

    public Link<Serializable> getProfileLink() {
        return getProfileViewLink();
    }

    public Link<Serializable> getProfileViewLink() {
        return new Link<Serializable>("profileView", new Model<Serializable>()) {

            private static final long serialVersionUID = 232185489384306999L;

            @Override
            public void onClick() {
                EMSSession session = (EMSSession) getSession();
                session.setActiveHorizonalMenu(2);
                setResponsePage(ProfileViewPage.class);
            }
        };  
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我没有实现Serializable,那么我将获得异常java.io.ObjectOutputStream.writeObject,这是由wicket框架的运行时环境抛出的.如果我实施它然后它就消失了.

那么当一个人调用ObjectInputStream#readobject()Singleton模式创建的某个对象的方法时会发生什么呢?

我没有添加wicket标签,因为我不认为这个问题与Wicket有关.

Ern*_*ill 5

不幸的是,默认情况下你会得到你的单身的第二个(或第三个,或第三十七个)实例 - 不好.幸运的是,有一种解决方法:通过实现readResolve()方法,该方法可以返回替换对象 - 在您的情况下是正确的单例对象 - 而不是默认序列化返回的对象.该链接描述了详细信息,但它非常简单 - 您只需实现此无参数实例方法即可返回单例对象.

  • 在`ObjectInputStream.readObject()`读取一个对象之后,它查看该对象以查看它是否具有`readResolve()`方法.如果是,则调用该方法,然后`readResolve()`返回的对象由`readObject()`返回,而不是原始读取的对象. (2认同)