package jdk_bug.foo.bean; import org.nustaq.serialization.FSTConfiguration; import org.nustaq.serialization.FSTObjectOutput; import java.io.*; import java.lang.reflect.Field; import java.nio.ByteBuffer; public class TestBean extends TestBeanAncestor { static ThreadLocal<FSTConfiguration> fstConf = null; static { fstConf = new ThreadLocal<FSTConfiguration>() { protected FSTConfiguration initialValue() { return FSTConfiguration.createDefaultConfiguration(); }; }; } public void doSomething(boolean fst) { serialize(new BillingValidationRule(), fst); } private final class BillingValidationRule implements Serializable { public BillingValidationRule() { } public Object rule = null; public int var1 = 1; public int var2 = 2; } public static void serialize(Object object, boolean useFst) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { if(useFst) { FSTObjectOutput out = fstConf.get().getObjectOutput(baos); out.writeObject(object); } else { getByteBuffer(object).position(0); getByteBuffer(object).putInt(9999); getByteBuffer(object).position(0); System.out.println("original object "+ extractFirstBufferField(object)); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); oos.close(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); Object deser = in.readObject(); int res = extractFirstBufferField(deser); System.out.println("deserialized "+ res); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } protected static int extractFirstBufferField(Object deser) throws IllegalAccessException { ByteBuffer p = getByteBuffer(deser); p.position(0); return p.getInt(); } private static ByteBuffer getByteBuffer(Object deser) throws IllegalAccessException { Field[] fields = deser.getClass().getDeclaredFields(); Field th0 = null; for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if ( field.getName().indexOf("this$0") >= 0 ) th0 = field; } th0.setAccessible(true); TestBean this0 = (TestBean) th0.get(deser); return ((AnImpl) this0.factory.a).p; } }