有代码如下
public abstract class Parameter implements Serializable
{
  static Map allParameters = new HashMap();
  
  private String name;
  
  private Parameter() {
    // typesafe enum pattern, no public constructor
  }
  
  protected Parameter(String name) {
    // typesafe enum pattern, no public constructor
    this.name = name;
    String key = makeKey(name);
    
    if(allParameters.containsKey(key))
      throw new IllegalArgumentException("Parameter name " + key + " already used!");
    
    allParameters.put(key, this);
  }
  
  private String makeKey(String name){
    return getClass() + " " + name;
  }
  
  public String toString() {
    return name;
  }
  protected Object readResolve() throws ObjectStreamException {
    Object par = allParameters.get(makeKey(name));
    
    if(par == null)
      throw new StreamCorruptedException("Unknown parameter value: " + name);
      
    return par;
  }
  
 }
不是很理解 protected Object readResolve() throws ObjectStreamException 为什么要有这个函数
明明在Serializable中没有任何的函数需要实现
这个函数的代码我明白
但是搞不明白的是 
1.为什么要有这个函数
2.这个函数在什么时候会被执行
3.这个函数有何意义.为什么jdk文档中没有这个函数的说明。

解决方案 »

  1.   

    这个函数是你自己写的啊,这个函数与Serializable无关!
      

  2.   

    我看了。我也觉得是自己写的。。可是 百度 google下之后发现
    readResolve() throws ObjectStreamException 
    抛出这个异常的例子很多。而且函数名也是如此的一致。并且都是实现了Serializable接口的。
    我很疑惑 很纳闷。。所以才找大家帮忙给看下。
      

  3.   

    这个函数是一个约定的函数,而不是在Serializable接口中定义的,这个方法的一个最常见的使用就是单例对象的序列化。
      

  4.   

    刚才仔细看了下api 果然
    那如果这样的话
    下面这4个都是约定吧 private void writeObject(java.io.ObjectOutputStream out)
         throws IOException
     private void readObject(java.io.ObjectInputStream in)
         throws IOException, ClassNotFoundException;
    Object writeReplace() throws ObjectStreamException;
      Object readResolve() throws ObjectStreamException;
    那这些约定.都应该如何写 如何定义呢? 譬如 如下的定义 是否符合标准。为什么private void writeObject(java.io.ObjectOutputStream out) throws IOException {   
        System.out.println("writeObject invoked");   
        out.writeObject(this.message == null ? "hohohahaha" : this.message);   
    }   
      
    private void readObject(java.io.ObjectInputStream in) throws IOException,   
            ClassNotFoundException {   
        System.out.println("readObject invoked");   
        this.message = (String) in.readObject();   
        System.out.println("got message:" + message);   
    }   
      
    private Object writeReplace() throws ObjectStreamException {   
        System.out.println("writeReplace invoked");   
        return this;   
    }   
      
    private Object readResolve() throws ObjectStreamException {   
        System.out.println("readResolve invoked");   
        return this;   
    }  
      

  5.   

    lz,不要google很多就怀疑,要自己仔细分析。相信自己的答案。
      

  6.   

    正解,Serializable里是没有任何方法的,它只起标示作用,你要坚信!