Index: src/main/java/java/io/ObjectOutputStream.java =================================================================== --- src/main/java/java/io/ObjectOutputStream.java (revision 506571) +++ src/main/java/java/io/ObjectOutputStream.java (working copy) @@ -1926,6 +1926,16 @@ // We get here if stream-based replacement produced the same object + // Is it a Class ? + if (objClass == ObjectStreamClass.CLASSCLASS) { + return writeNewClass((Class) object, unshared); + } + + // Is it an ObjectStreamClass ? + if (objClass == ObjectStreamClass.OBJECTSTREAMCLASSCLASS) { + return writeClassDesc((ObjectStreamClass) object, unshared); + } + // Is it a String ? (instanceof, but == is faster) if (objClass == ObjectStreamClass.STRINGCLASS) { return writeNewString((String) object, unshared); Index: src/test/java/tests/api/java/io/ObjectOutputStreamTest.java =================================================================== --- src/test/java/tests/api/java/io/ObjectOutputStreamTest.java (revision 506438) +++ src/test/java/tests/api/java/io/ObjectOutputStreamTest.java (working copy) @@ -498,6 +498,8 @@ protected Object replaceObject(Object obj) throws IOException { if (obj instanceof NotSerializable) { return new Long(10); + } else if (obj instanceof Integer) { + return new Long(((Integer) obj).longValue()); } else { return obj; } @@ -1253,5 +1255,24 @@ oos.close(); ois.close(); assertTrue("replaceObject has not been called", (obj instanceof Long)); + + // Regression for HARMONY-3158 + baos = new ByteArrayOutputStream(); + oos = new ObjectOutputStreamWithReplace(baos); + + oos.writeObject(new Integer(99)); + oos.writeObject(Integer.class); + oos.writeObject(ObjectStreamClass.lookup(Integer.class)); + oos.flush(); + + ois = new ObjectInputStream(new ByteArrayInputStream (baos.toByteArray())); + Object obj1 = ois.readObject(); + Object obj2 = ois.readObject(); + Object obj3 = ois.readObject(); + oos.close(); + ois.close(); + assertTrue("1st replaceObject worked incorrectly", (obj1 instanceof Long) && (((Long) obj1).longValue() == 99)); + assertEquals("2nd replaceObject worked incorrectly", obj2, Integer.class); + assertEquals("3rd replaceObject worked incorrectly", obj3.getClass(), ObjectStreamClass.class); } }