import com.thoughtworks.xstream.XStream; import junit.framework.TestCase; import java.io.*; import java.util.ArrayList; /** * @author kbow */ public class WriteReplaceTest extends TestCase { public WriteReplaceTest() { } public WriteReplaceTest(String string) { super(string); } public void testWriteReplace() throws Exception { final XStream x = new XStream(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream out = x.createObjectOutputStream(baos); out.writeObject(new ContainerClass(new Class2("bacon"))); out.close(); String xml = baos.toString(); // simulate going to another JVM where Class2 does not exist xml = xml.replaceAll("WriteReplaceTest\\$Class2", "WriteReplaceTest\\$ClassNotFound"); final ObjectInputStream in = x.createObjectInputStream(new ByteArrayInputStream(xml.getBytes())); ContainerClass result = (ContainerClass) in.readObject(); in.close(); assertFalse(result.getValue().getClass().toString(), result.getValue() instanceof Class2); } public static class ContainerClass implements Serializable { private static final long serialVersionUID = 51659414317584423L; private final MyList list = new MyList(); public ContainerClass(Class1 value) { this.list.add(new Entry(value)); } public Class1 getValue() { return list.get(0).getValue(); } } public static class MyList extends ArrayList { private static final long serialVersionUID = -2968287405560894835L; } public static class Entry implements Serializable { private static final long serialVersionUID = 98694494064222766L; private final Class1 value; public Entry(Class1 value) { this.value = value; } public Class1 getValue() { return value; } } public static class Class1 implements Serializable { private static final long serialVersionUID = -2213963465525700398L; private final String value; public Class1(String value) { this.value = value; } public String getValue() { return value; } } public static class Class2 extends Class1 { private static final long serialVersionUID = -6452200443845709665L; public Class2(String value) { super(value); } private Object writeReplace() { return new Class1(getValue()); } } }