• readResolve()方法与串行化


    在CJC(一) 中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题.

      原来这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). ??? 怎么跟对象的序列化相关了?

      下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口, 我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象. 不过当序列化遇到单例时,这里边就有了个问题: 从内存读出而组装的对象破坏了单例的规则. 单例是要求一个JVM中只有一个类对象的, 而现在通过反序列化,一个新的对象克隆了出来.

      如下例所示:

      Java代码

    public final class MySingleton implements Serializable {  
         private MySingleton() { }  
         private static final MySingleton INSTANCE = new MySingleton();  
         public static MySingleton getInstance() { return INSTANCE; }  
    }  
    public final class MySingleton implements Serializable {
         private MySingleton() { }
         private static final MySingleton INSTANCE = new MySingleton();
         public static MySingleton getInstance() { return INSTANCE; }
    }

     当把 MySingleton对象(通过getInstance方法获得的那个单例对象)序列化后再从内存中读出时, 就有一个全新但跟原来一样的MySingleton对象存在了. 那怎么来维护单例模式呢?这就要用到readResolve方法了. 如下所示:

      Java代码 

    public final class MySingleton implements Serializable{  
        private MySingleton() { }  
        private static final MySingleton INSTANCE = new MySingleton();  
        public static MySingleton getInstance() { return INSTANCE; }  
        private Object readResolve() throws ObjectStreamException {  
           // instead of the object we're on,   
          // return the class variable INSTANCE   
          return INSTANCE;  
       }  
    }  
    public final class MySingleton implements Serializable{
        private MySingleton() { }
        private static final MySingleton INSTANCE = new MySingleton();
        public static MySingleton getInstance() { return INSTANCE; }
        private Object readResolve() throws ObjectStreamException {
           // instead of the object we're on,
           // return the class variable INSTANCE
          return INSTANCE;
       }
    }

    这样当JVM从内存中反序列化地"组装"一个新对象时,就会自动调用这个 readResolve方法来返回我们指定好的对象了, 单例规则也就得到了保证.

      上面用的例子来源于这个链接:http://www.javalobby.org/java/forums/t17491.html, 另这个链接中还有一个更为高级的例子, 如有兴趣可去一看.

     
  • 相关阅读:
    【Solr】新建core后,启动服务访问web报错 HTTP Status 503
    【Tomcat】tomcat报连接超时错误
    【Tomcat】tomcat报错 removeGeneratedClassFiles failed
    【MongoDB】MongoDb的“not master and slaveok=false”错误及解决方法
    【Solr】 solr对拼音搜索和拼音首字母搜索的支持
    【Junit】The import org.junit.Test conflicts with a type defined in the same file报错
    maven的pom.xml文件报错问题
    ubuntu卸载virtualbox
    ClassNotFoundException: INameEnvironment
    详解为什么32位系统只能用4G内存.
  • 原文地址:https://www.cnblogs.com/kakafra/p/2740436.html
Copyright © 2020-2023  润新知