/* * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * * @bug 4087295 * @build install/SerialDriver.java test/SerialDriver.java extension/ExtendedObjectInputStream.java * @summary Enable resolveClass() to accommodate package renaming. * This fix enables one to implement a resolveClass method that maps a * Serializable class within a serialization stream to the same class * in a different package within the JVM runtime. See run shell script * for instructions on how to run this test. */ package install; import java.io.*; import extension.ExtendedObjectInputStream; public class SerialDriver implements Serializable { private static final long serialVersionUID = 1L; String name; SerialDriver next; transient Object objarray[]; public SerialDriver() { name = ""; next = null; } public SerialDriver(String name, SerialDriver next) { this.name = name; this.next = next; } static boolean serialize; static boolean deserialize; public static void main(String args[]) throws Exception { SerialDriver obj = new SerialDriver("SerialDriver_2", new SerialDriver()); SerialDriver[] array = new SerialDriver[5]; for (int i = 0; i < array.length; i++) array[i] = new SerialDriver("SerialDriver_1_" + i, new SerialDriver()); /* * see if we are serializing or deserializing. * The ability to deserialize or serialize allows * us to see the bidirectional readability and writeability */ if (args.length == 1) { if (args[0].equals("-d")) { deserialize = true; } else if (args[0].equals("-s")) { serialize = true; } else { usage(); throw new Exception("incorrect command line arguments"); } } else { usage(); throw new Exception("incorrect command line arguments"); } File f = new File("stream.ser"); if (serialize) { // Serialize the subclass try (FileOutputStream fo = new FileOutputStream(f); ObjectOutputStream so = new ObjectOutputStream(fo)) { so.writeObject(obj); /* Skip arrays since they do not work with rename yet. The serialVersionUID changes due to the name change and there is no way to set the serialVersionUID for an array. */ so.writeObject(array); } catch (Exception e) { System.out.println(e); throw e; } } if (deserialize) { // Deserialize the subclass try (FileInputStream fi = new FileInputStream(f); ExtendedObjectInputStream si = new ExtendedObjectInputStream(fi)) { si.addRenamedClassName("test.SerialDriver", "install.SerialDriver"); si.addRenamedClassName("[Ltest.SerialDriver;", "[Linstall.SerialDriver"); obj = (SerialDriver) si.readObject(); array = (SerialDriver[]) si.readObject(); } catch (Exception e) { System.out.println(e); throw e; } System.out.println(); System.out.println("Printing deserialized class: "); System.out.println(); System.out.println(obj.toString()); System.out.println(); } } public String toString() { String nextString = next != null ? next.toString() : ""; return "name =" + name + " next = <" + nextString + ">"; } /** * Prints out the usage */ static void usage() { System.out.println("Usage:"); System.out.println(" -s (in order to serialize)"); System.out.println(" -d (in order to deserialize)"); } }