This is the mail archive of the mailing list for the Mauve project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Serialization: parent readResolve tests


These are tests for deserialization, in the case where the object's class's parent has a readResolve class. I put the rationale for the tests in comments in the source. All tested free runtimes (kaffe, gij, gcj, jamvm) get this wrong when that readResolve is visible. (sablevm fails with todo errors)

By the way, I'm a developer for the Nice project, an advanced open source extension of Java. By trying to bootstrap or running our testsuite on free VMs, I occasionally run into bugs that call for a mauve test. Would it make sense for me to ask for cvs write access?


The Nice programming language:
// Tags: JDK1.1

// Copyright (C) 2005 Daniel Bonniot <>

// This file is part of Mauve.

// Mauve is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.

// Mauve is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Mauve; see the file COPYING.  If not, write to
// the Free Software Foundation, 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.  */


import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;


 * Check when a parent readResolve() method should be used for subclasses.
 * Here is the rationale for this test, based on Sun's javadoc for
 * First, readResolve must be declared with:
 *   ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
 * Thus, a non-private readResolve is OK.
 * Second, the rules for invoking readResolve (as for writeReplace) are that
 * it must be called if it would be accessible from the class of the object
 * being deserialized. So, a non-private readSolve method in the parent must
 * be called, but a private one should not be.
public class ParentReadResolve implements Testlet {

  public void test(TestHarness harness)
    try {
      ByteArrayOutputStream outb = new ByteArrayOutputStream();
      ObjectOutputStream outs = new ObjectOutputStream(outb);

      outs.writeObject(new MyFoo());

      byte[] store = outb.toByteArray();

      ByteArrayInputStream inb = new ByteArrayInputStream(store);
      ObjectInputStream ins = new ObjectInputStream(inb);

      MySingleton x = (MySingleton) ins.readObject();
      harness.check(x == MySingleton.instance);

      MyFoo foo = (MyFoo) ins.readObject();
      harness.check(! foo.resolved);
    catch (Throwable e) {

  //// Singleton/MySingleton with a non-private readResolve ////

  static abstract class Singleton implements
    abstract Singleton getInstance();

    /** NOTE: this readResolve is not private.
    Object readResolve() {
      return getInstance();

  static class MySingleton extends Singleton
    static final MySingleton instance = new MySingleton();

    Singleton getInstance() { return instance; }

  //// Foo/MyFoo with a private readResolve ////

  static abstract class Foo implements
    boolean resolved = false;

    /** NOTE: this readResolve is private.
    private Object readResolve() {
      resolved = true;
      return this;

  static class MyFoo extends Foo
? gnu/testlet/java/io/Serializable/
Index: ChangeLog
RCS file: /cvs/mauve/mauve/ChangeLog,v
retrieving revision 1.893
diff -u -r1.893 ChangeLog
--- ChangeLog	24 Feb 2005 20:53:29 -0000	1.893
+++ ChangeLog	26 Feb 2005 00:31:11 -0000
@@ -1,3 +1,7 @@
+2005-02-26  Daniel Bonniot  <>
+	* gnu/testlet/java/io/Serializable/ New test.
 2005-02-24  Audrius Meskauskas  <>
     * gnu/testlet/javax/swing/JFrame/ New test.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]