1 /*
   2  * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @bug 4363844
  26  * @summary Verify that a custom readObjectNoData method, if defined properly
  27  *          by a serializable superclass, gets invoked during deserialization
  28  *          of a subclass instance whose serialized form omits a class
  29  *          descriptor corresponding to the superclass.
  30  */
  31 
  32 import java.io.*;
  33 
  34 /* Non-serializable superclass which defines readObjectNoData:
  35  * readObjectNoData should not get called.
  36  */
  37 class A {
  38     private static final long serialVersionUID = 0L;
  39     boolean aCalled = false;
  40     private void readObjectNoData() throws ObjectStreamException {
  41         aCalled = true;
  42     }
  43 }
  44 
  45 /* Serializable superclass which defines readObjectNoData with wrong signature:
  46  * readObjectNoData should not get called.
  47  */
  48 class B extends A implements Serializable {
  49     private static final long serialVersionUID = 0L;
  50     boolean bCalled = false;
  51     private void readObjectNoData(int wrong) throws ObjectStreamException {
  52         bCalled = true;
  53     }
  54 }
  55 
  56 /* Serializable superclass which defines readObjectNoData correctly, and is not
  57  * listed in stream: readObjectNoData should get called.
  58  */
  59 class C extends B {
  60     private static final long serialVersionUID = 0L;
  61     boolean cCalled = false;
  62     private void readObjectNoData() throws ObjectStreamException {
  63         cCalled = true;
  64     }
  65 }
  66 
  67 /* Serializable superclass which defines readObjectNoData correctly, but whose
  68  * corresponding class descriptor is listed in stream: readObjectNoData should
  69  * not get called.
  70  */
  71 class D extends C {
  72     private static final long serialVersionUID = 0L;
  73     boolean dCalled = false;
  74     private void readObjectNoData() throws ObjectStreamException {
  75         dCalled = true;
  76     }
  77 }
  78 
  79 /* Serializable superclass which defines readObjectNoData with wrong access:
  80  * readObjectNoData should not get called.
  81  */
  82 class E extends D {
  83     private static final long serialVersionUID = 0L;
  84     boolean eCalled = false;
  85     void readObjectNoData() throws ObjectStreamException {
  86         eCalled = true;
  87     }
  88 }
  89 
  90 /* Instance class.
  91  */
  92 class F extends E {
  93     private static final long serialVersionUID = 0L;
  94 }
  95 
  96 public class Read {
  97     public static void main(String[] args) throws Exception {
  98         FileInputStream in = new FileInputStream("tmp.ser");
  99         try {
 100             ObjectInputStream oin = new ObjectInputStream(in);
 101             F f = (F) oin.readObject();
 102             if (f.aCalled || f.bCalled || f.dCalled || f.eCalled) {
 103                 throw new Error("readObjectNoData invoked erroneously");
 104             }
 105             if (! f.cCalled) {
 106                 throw new Error("readObjectNoData not invoked");
 107             }
 108         } finally {
 109             in.close();
 110         }
 111     }
 112 }