import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Outer2
    implements Serializable {

    String outerField = "outerField";
    Inner2 inner = new Inner2();
    
    public void output() {
	printString(outerField);
	inner.output();
    }

    private void printString(String s) {
	System.out.println("printString(" + s + ")");
    }
    
    private class Inner2
	implements Serializable {

	transient String innerField = "innerField";

	public void output() {
	    printString(innerField);
	}

	private void writeObject(ObjectOutputStream oos)
	    throws IOException {
	    oos.writeObject(innerField);
	}

	private void readObject(ObjectInputStream ois)
	    throws IOException, ClassNotFoundException {
	    innerField = (String)ois.readObject();
	}
    }

    public static void main(String[] args) {

	try {
	    Outer2 before = new Outer2();
	    System.out.println("Before");
	    before.output();
	    
	    File tf = File.createTempFile("jvser", "obj");
	    
	    FileOutputStream fos = new FileOutputStream(tf);
	    ObjectOutputStream oos = new ObjectOutputStream(fos);
	    oos.writeObject(before);
	    oos.flush();
	    fos.close();


	    FileInputStream fis = new FileInputStream(tf);
	    ObjectInputStream ois = new ObjectInputStream(fis);
	    Outer2 after = (Outer2)ois.readObject();
	    fis.close();

	    System.out.println("After");
	    after.output();

	    tf.delete();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
}

